我最近偶然发现了loeb
和moeb
函数here,我正在尝试探索它能做些什么。
我正在尝试实现类似电子表格的行为,可能会在某些“单元格”中执行IO
。我认为moeb traverse
似乎是一个很好的候选者,但是我使用的列表中的任何非平凡(即const $ return something
除外)函数都会导致整个调用永远运行。在此之后,我尝试在State
monad中测试它:
moeb f x = fix $ \g -> f ($g) x
foo v = do
x <- get
vs <- v
put (x + 3)
return (x + (vs!!0))
test = [
const $ return 7,
foo,
fmap length
]
main = print $ runState (moeb traverse test) 5
结果如下:
([7,12,3],moeb.hs: out of memory
为什么会这样? foo
获取并设置状态,但它评估正常,而最终状态的评估挂起。
我如何实现终止的电子表格与IO行为?
答案 0 :(得分:1)
moeb traverse test :: State Int [Int]
是操作,用于生成整数列表。
如果您展开moeb
的定义,则会获得
moeb traverse test
= traverse ($ moeb traverse test) test
意味着电子表格中的每个元素都从头开始传递操作 moeb traverse test
,而不是递归地使用操作的结果。
使用moeb
推广mfix
可能有所帮助,但我怀疑结果是否值得。