2013-10-30 60 views
3

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

回答

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 

我找到第二位到少一点繁琐。这是一件小事,但我觉得它很奇怪(比这个例子更复杂,不太可能是已经存在于图书馆中的东西),一元循环看起来足够好,以至于我用这个习语是值得的。我也这样做,它可以避免将另一个名称绑定到do块的上下文中。