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.