gpt4 book ai didi

haskell - 如何通过隐藏 'state'更改以sig类型编写没有IO的haskell函数

转载 作者:行者123 更新时间:2023-12-04 09:33:14 24 4
gpt4 key购买 nike

我在 haskell 中编写了一个函数,它接受一些参数,如 Word32、String(忽略柯里化(Currying))并输出 IO Word32。现在,这是一个 功能 真正意义上的:对于相同的输入,输出将始终相同 .没有副作用。该函数返回 IO Word32 而不是 Word32 的原因是该函数在一个循环中多次更新许多 32 位线性反馈移位寄存器 (lfsr) 和其他寄存器,以计算最终的 Word32 输出。

我的问题是:鉴于此功能 有效地没有副作用 ,是否可以在函数实现中隐藏这些寄存器更新,以便函数返回 Word32 而不是 IO Word32?如果是这样,怎么做?

最佳答案

是的! Haskell 可以做到这一点。

ST monad

如果您实际上使用了对函数外部的观察者完全隐藏的可变状态(寄存器),那么您在 the ST monad 中。 ,仅用于内存效果的单子(monad)。您通过runST进入ST世界,并且当您退出该功能时,所有效果都保证不可见。

这正是处理本地可变状态的正确计算环境。

纯功能状态:State monad

但是,如果您实际上并没有改变寄存器或单元格,而是多次更新纯函数值,则可以使用更简单的环境:the State monad .这不允许可变状态,但会产生本地状态的错觉。

IO 和 unsafePerformIO

最后,如果你有局部的、可变的效果,比如 ST monad,但出于某种原因,您将需要在该状态下进行 IO 操作(例如通过 FFI 调用),您可以模拟 ST monad,几乎同样安全,通过使用 unsafePerformIO , 而不是 runST ,引入本地IO环境。由于 IO monad 没有很好的类型来强制抽象,因此您需要手动确保自己不会观察到副作用。

关于haskell - 如何通过隐藏 'state'更改以sig类型编写没有IO的haskell函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6074222/

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