基本上,我希望能够编写如下代码:
main = do
x <- newVal (2 :: Int)
y <- newVal (3 :: Int)
z <- newFunc (x, y) (\(a,b) -> a * b)
r1 <- readVal z
print r1 -- prints 6 (2 * 3)
setVal x 5
r2 <- readVal z
print r2 -- prints 15 (5 * 3)
有人可以从头开始或从库中提供一些示例代码来让我实现上述目标吗?
最佳答案
这几乎就是 STRef
的功能和 IORef
,除非我在上面的评论中提到,你不能得到一个完全多态的 newFunc
.你必须做一些类似于 liftA2
的事情.
import Data.IORef
main = do
x <- newVal (2 :: Int)
y <- newVal (3 :: Int)
let z = liftIORef2 (x, y) (\(a,b) -> a * b)
r1 <- readVal z
print r1 -- prints 6 (2 * 3)
setVal x 5
r2 <- readVal z
print r2 -- prints 15 (5 * 3)
liftIORef2 (a, b) f = do
a' <- readIORef a
b' <- readIORef b
return (f (a', b'))
newVal = newIORef
setVal = writeIORef
readVal = id
*Main> main
6
15
关于haskell - 自动重新计算结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591629/