6

インスタンスは次のように定義されます。

instance MonadFix [] where
  mfix f = case fix (f . head) of
             []    -> []
             (x:_) -> x : mfix (tail . f)

[]しかし、非決定論的計算と見なされるモナドに関して、その背後にある直感的な意味を把握できていません。In mfix ffunctionfはその引数で厳密であってはならないため、引数を調べることができません。また、定義によれば、出力のどこでも引数を使用することはできません。そうしないと、ある時点でヒットfix (f . head)して発散します。mfixでは、 for リスト以外の用途 (または良い例) はありますmfix (const someList)か?

4

2 に答える 2

0

fix実際に厳密な関数で使用すると、すべてのバリアントに問題がありますが、それは通常、実際のユースケースでは問題にならない :a基本的に常に関数型であり、任意のラムダは既に NF にあります。

したがって、具体的な使用法については...まあ、少なくとも収束するものは次のとおりです。

f :: (Int -> Int) -> [Int -> Int]

f f' = [\x -> if x>0 then f' (x-1) * i else 1 | i<-[0..]]

f基本的にべき乗関数のリストを生成します。

GHCi> take 20 $ mfix f <*> [1,2] [0,0,1,1,2,4,3,9,4,16,5,25,6,36,7,49,8,64,9,81]

これが実際に何に役立つかはわかりませんが、非常に興味深い動作をします。

実際には単一の と同等であるため、これは悪い例であることに気付きましたfix (f . head)。うーん...


あなたはかなり正しいようです: これの場合の問題a -> [a]です. 厳密にすることなく引数に依存するリスト構造を作成する明白な方法がないからです.

于 2016-07-03T11:39:06.187 に答える