3

私は少し混乱しています。Haskell で通常の再帰関数を定義することには問題はありません。同時に、fix固定小数点を介して再帰ラムダを定義するための標準関数があります。しかし、そのように定義された再帰ラムダは読みにくいだけでなく、自分自身を直接呼び出す通常の再帰関数と比較してアプリケーションのオーバーヘッドがあります。では、再帰ラムダと が実際に必要になるのはどこでしょうfixか?

4

1 に答える 1

8

あなたはそれを必要としません。ただし、少し便利な場合もあります。

foo = do
    foo1
    x <- foo2
    let loop = do
       y <- bar x
       if pred y then loop else return y
    z <- loop
    foo3 z

foo = do
    foo1
    x <- foo2
    z <- fix $ \loop -> do
       y <- bar x
       if pred y then loop else return y
    foo3 z

2番目から少し面倒だと思います。それは些細なことですが、私はそれが奇妙に見えると思います (つまり、その例よりも複雑で、既にライブラリに存在する可能性が低い) モナドループが十分に良く見えるので、そのイディオムを使用する価値があります。doまた、ブロックのコンテキストに別の名前をバインドしないようにすることも気に入っています。

于 2013-10-30T05:20:40.117 に答える