2017-10-11 8 views
2

私は最近、loebmoebの機能hereを見つけました。私はそれができることを探そうとしています。moeb traverse non-termination

私は一部の「セル」でIOを実行する可能性があるスプレッドシートのような動作を実現しようとしています。私はmoeb traverseがこれを行う良い候補のように思えていたが、私が使用したリストのなかでは(つまり、const $ return something以外の)機能は永遠に実行するために全呼び出しを引き起こした。

([7,12,3],moeb.hs: out of memory 

このエラーが発生する理由:この後、私は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 

結果でしたか? fooは状態を取得して設定しますが、最終状態の評価がハングする間は正常に評価されます。 そして、どのようにして終了するスプレッドシートとIOの動作を達成できますか?

答えて

1

moeb traverse test :: State Int [Int]は、アクションであり、整数のリストを生成します。

あなたがmoebの定義を展開する場合は、アクションの結果をスプレッドシートFの各要素は、ゼロから、moeb traverse testが実行されるアクションを渡されることを意味し、代わりに使用して

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

取得再帰的に。

一般moebを使用すると、mfixを使用すると役立つかもしれませんが、結果が問題になるとは思わないでしょう。

+0

なぜそれがハングするのか分かりますが、 'mfix'を使って' moeb'を一般化するとどういう意味ですか? – Ryba

+0

単純なものは 'moebM f x = mfix $ \ g - > f($ g)x'です。最初の引数として 'traverse'を使いますが、' test'は別の型に変更する必要があります。 –

+0

これはうまくいきました、ありがとう – Ryba

関連する問題