递归函数与Haskell中的递归lambdas

时间:2013-10-30 05:01:50

标签: haskell

我有点困惑。在Haskell中定义普通的递归函数没有问题。同时,标准fix函数用于通过固定点定义递归lambda。但是除了可读性较低之外,与直接调用自身的常规递归函数相比,定义的递归lambda具有应用程序开销。那么我在哪里需要递归的lambdas和fix

1 个答案:

答案 0 :(得分:8)

你永远不需要它。不过有时候它有点方便。

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

VS

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

我觉得第二点不那么麻烦。这是一个小问题,但我认为这很奇怪(也就是说,比这个例子更复杂,不太可能是已经存在于库中的东西)monadic循环看起来足够好,以至于使用这个成语对我来说是值得的。我也喜欢它避免将另一个名称绑定到do块的上下文中。