2017-10-11 200 views
2

我最近偶然发现了loebmoeb函数here,我试图探索它可以做什么。moeb遍历不终止

我试图实现类似电子表格的行为,并在某些“单元格”中执行IO。我认为moeb traverse看起来是个不错的选择,但是我使用的列表中的任何非平凡(即除const $ return something之外的函数)都会导致整个调用永远运行。这之后,我想测试它在State单子:

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

moeb traverse test :: State Int [Int]动作产生一个整数列表。

如果你展开的moeb定义,你

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

这意味着每个元素F上的电子表格通过行动moeb traverse test来运行,从头开始,而不是使用作用的结果递归。

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

+0

好吧,我明白了它为什么会挂起,但是通过使用'mfix'推广'moeb'意味着什么? – Ryba

+0

一个简单的例子就是'moebM f x = mfix $ \ g - > f($ g)x'。使用'traverse'作为第一个参数,但'test'需要改变为不同的类型。 –

+0

这工作,谢谢 – Ryba