gpt4 book ai didi

haskell - 如何模拟haskell状态?

转载 作者:行者123 更新时间:2023-12-04 17:51:28 24 4
gpt4 key购买 nike

我写了一些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 时存储 pin 的先前状态。 .

我尝试了状态单子(monad)。但问题是状态单子(monad)基于初始状态值传递状态。但在随后对 onoff 的调用中改变初始状态值似乎是不可能的。我想到了 IORef ,似乎没有什么不同。看起来它正在做状态正在做的事情..但仅限于 IO 内部。

我可以清楚地看到我非常缺少将状态存储在全局变量中的能力。而且我很高兴我无法做到这一点,因为我知道还有其他一些惯用的方法可以实现相同的目标。

非常感谢任何在正确方向上的帮助。

欢呼和问候。

最佳答案

State monad 实际上是对在函数的额外参数中传递状态的概念的抽象——它仍然是纯粹的,它只是为你提供了很多语法帮助。 IORef另一方面,它是实际可变值的实际更新,这就是它必须存在于 IO 中的原因。单子(monad)。这通常被认为是不可取的,除非出于性能原因需要,因为您失去了使用纯代码获得的所有关于惰性、执行顺序和并发性的 promise 。

使用 StateIO一起是通过使用 StateT monad 转换器来实现的,这可以被认为是将 State monad 包裹在 IO monad 周围。 Haskell wiki 上有一些示例:http://www.haskell.org/haskellwiki/Simple_StateT_use它显示了在使用 I/O 时如何维护状态,以及如何使用 lift让 IO monad 函数在 StateT 内部运行.

关于haskell - 如何模拟haskell状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15356749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com