haskell - 自动重新计算结果

标签 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)

有人可以从头开始或从库中提供一些示例代码来让我实现上述目标吗?

最佳答案

这几乎就是 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/

相关文章:

html - 如何在 EOF 处停止 Haskell Parsec 解析器

haskell - 使用foldr 实现init

ios - 如何将 ReactiveCocoa 与手势识别器一起使用

json - meteor `Deps.autorun` 与 `Collection.observe`

javascript - Meteor - Template.currentData() 没有反应?

haskell - 使用 HaskellDB 取消映射表记录的基本示例

exception - 在 catch 子句中获取变量

android - RxJava - 等到重试完成其他 Activity/fragment 中的其他可观察对象

java - 如何从客户端角度使用异步方法

haskell - 在 Haskell 中同时读取和写入同一文件时出错