2013-10-30 185 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塊的上下文中。