haskell 中的***可变变量

Posted

技术标签:

【中文标题】haskell 中的***可变变量【英文标题】:Top level mutable variables in haskell 【发布时间】:2014-06-04 09:53:18 【问题描述】:

我有一个 C++ 程序多次调用我的 Haskell 程序。但是第一次调用的一些数据需要为后续调用保留。我知道 Haskell 默认不支持***可变变量,但我想我仍然需要类似的东西。 (将我的状态写入文件并将其读回可以,但我想要更原生的东西)

在 hackage 中,我发现了 global-variables 或 safe-globals 之类的库,但它们似乎都相当老旧,并且依赖于我已经使用的旧版本的包。 这个问题有规范的解决方案吗?

理想情况下,我希望拥有***功能:

getState :: IO Mystate
writeState :: Mystate -> IO ()

(我想我还应该提到,一切都是在 FFI 中的一次 hs_init() 调用中完成的,因此 Haskell 程序在调用之间不会真正退出)

【问题讨论】:

你的入口点可以不返回结果并接受参数吗?然后第一次调用它的东西可以将该信息传递给第二次调用它的任何东西,它可以将它传回。 这是a detailed answer 来回答一个非常相似的问题;它基本上扩展了 Mike Hartl 的答案。 【参考方案1】:

您可以创建一个全局可变变量:

myGlobalVar :: IORef Int
-# NOINLINE myGlobalVar #-
myGlobalVar = unsafePerformIO (newIORef 17)

haskell wiki 将此作为当前的标准解决方案,同时还讨论替代方案。

【讨论】:

以上是关于haskell 中的***可变变量的主要内容,如果未能解决你的问题,请参考以下文章

Haskell - 基于 Actor 的可变性

Haskell 是不是支持未绑定的变量?

具有可变输入数量的Haskell生成器?

需要列表的原始长度作为 Haskell 中的“变量”,但它会随着递归而不断变化 [重复]

Haskell - 模棱两可的类型变量

没有变量的Haskell