moeb遍历非终止

时间:2017-10-11 14:47:29

标签: haskell recursion

我最近偶然发现了loebmoeb函数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行为?

1 个答案:

答案 0 :(得分:1)

moeb traverse test :: State Int [Int]操作,用于生成整数列表。

如果您展开moeb的定义,则会获得

moeb traverse test
  = traverse ($ moeb traverse test) test

意味着电子表格中的每个元素都从头开始传递操作 moeb traverse test,而不是递归地使用操作的结果。

使用moeb推广mfix可能有所帮助,但我怀疑结果是否值得。