2

「ビュー」データ構造と関連する演算子などControl.Monad.Freeを非表示にするのはなぜですか?purescript-freeFreeViewtoView

Free モナドの通常の定式化では -

data Free f a = Pure a | Free (f (Free f a))

そして、次のような Functor が与えられた -

data TeletypeF a = PutStrLn String a | GetLine (String -> a)

チェーン化された PutStrLn 呼び出しを次のように折りたたむ単純な (醜い) コードをいくつか書くことができます -

collapseChained :: Free TeletypeF a -> Free TeletypeF a
collapseChained (Free (PutStrLn s1 (Free (PutStrLn s2 c)))) = Free PutStrLn (s1 ++ s2) c
collapseChained f = f

実際のデータ コンストラクターを使用せずに、collapseChainedPurescript の によってエクスポートされた関数を使用することと同等のことは可能ですか?Control.Monad.Free

4

1 に答える 1

1

しばらくの間、これをやろうとしましたrunFreeMが、成功しなかったので、いや、このように直接変換することはできないと思います.

あなたが言及する通常の定式化はFree、スタックセーフにすることができないため、PureScript での使用には適していないため、残念ながらツリーの直接操作は不明瞭です。内部の安全でない強制を使用してReflection without Remorseのスタイルで実装を可能にしているため、コンストラクターは現在まったくエクスポートされていません。

以前は、 scalaz に似た強制なしのわずかに異なる実装Freeがありました。これもスタックセーフな実装が必要なためですが、これにも同じ問題があったと思います。

より多くの内部 ( fromViewtoViewなど) を公開すれば可能かもしれませんが、直接的なパターン マッチング アプローチよりも快適ではありません。

于 2016-01-05T15:31:07.613 に答える