我写了一些haskell代码来切换树莓派上的一个引脚,这取决于我从树莓派上的另一个引脚获得的中断。在不知道先前的切换状态的情况下,我根本不知道如何切换引脚的状态。该程序本身非常简单。
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
所以基本上这里发生的是引脚 7 被注册为中断。只要引脚 7 从高电平变为低电平或从低电平变为高电平,就会触发中断。每当触发中断时,它都会调用onoff
切换引脚 0 状态的函数。
main
功能是正确的。它的onoff
功能就是问题所在。该onoff
函数的预期行为是在引脚为低电平时使引脚 0 为高电平,并在引脚为高电平时将引脚切换为低电平。但要做到这一点,我需要在上一次调用onoff
.
我尝试了状态单子。但问题是状态单子基于初始状态值传递状态。但在随后的调用中onoff
,似乎不可能更改初始状态值。我想到了 IORef ,似乎没有什么不同。看起来它正在做状态正在做的事情..但仅限于 IO 内部。
我可以清楚地看到我非常缺少将状态存储在全局变量中的能力。而且我很高兴我无法做到这一点,因为我知道还有其他一些惯用的方法可以实现相同的目标。
非常感谢任何在正确方向上的帮助。
欢呼和问候。