自动重新计算结果

Cli*_*ton 4 haskell reactive-programming

基本上,我希望能够编写如下代码:

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)
Run Code Online (Sandbox Code Playgroud)

有人可以从头开始或从库中提供一些示例代码,以便我能够实现上述类似的功能吗?

Tom*_*lis 5

这几乎是完全的功能STRefIORef,除了我上面我的评论提到,你不能得到完全的多态性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
Run Code Online (Sandbox Code Playgroud)