jak symulować stan haskell?

Napisałem kod haskell, aby przełączyć pin na raspberry pi w zależności od przerwania, które otrzymuję od innego pin na piśmie raspberry. Po prostu nie wiem, jak przełączyć stan szpilki bez znajomości poprzedniego stanu przełączania. Sam program jest bardzo prosty.

 import Control.Concurrent
 import Data.IORef
 import HasberryPi


 main = do wiringPiSetup
           pinMode 0 output
           pinMode 7 input 
           pullUpDnControl 7 pull_down
           wiringPiISR 7 edge_both onoff
           threadDelay (15*(10^6))

 onoff s = do a <- readIORef s                               -- This is wrong
              digitalWrite 0 (if b then pinhigh else pinlow) -- This is wrong

Tak więc w zasadzie to, co dzieje się tutaj, jest zarejestrowane jako przerwanie. Przerwanie jest wyzwalane, gdy pin 7 przechodzi z wysokiego do niskiego lub niskiego do wysokiego. I za każdym razem, gdy zostanie przerwane, wywołujeonoff funkcja, która przełącza stan pin 0.

Themain funkcja jest poprawna. To jestonoff funkcja, która jest problemem. Chciane zachowanieonoff Funkcja polega na tym, aby pin 0 był wysoki, gdy pin jest niski i przełącza pin na niski, gdy jest wysoki. Ale żeby to zrobić, muszę zachować poprzedni stan szpilki w poprzednim wywołaniuonoff.

Spróbowałem monady państwowej. Problem polega jednak na tym, że monada stanu przechodzi w stan wokół w oparciu o wartość stanu początkowego. Ale przy kolejnych wywołaniachonoff zmiana wartości stanu początkowego wydaje się niemożliwa. Myślałem o IORef i wydaje się, że nie jest inaczej. Wygląda na to, że robi to, co robi stan ... ale tylko wewnątrz IO.

Widzę wyraźnie, że bardzo brakuje mi możliwości przechowywania stanu w zmiennej globalnej. I cieszę się, że nie jestem w stanie tego zrobić, ponieważ wiem, że istnieje jakiś inny idiomatyczny sposób osiągnięcia tego samego celu.

Każda pomoc we właściwym kierunku jest bardzo ceniona.

Pozdrawiam i pozdrawiam.

questionAnswers(2)

yourAnswerToTheQuestion