2017-10-11 192 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