3
我有點困惑。在Haskell中定義普通的遞歸函數沒有問題。同時還有標準的fix
函數用於通過固定點定義遞歸lambda表達式。但是除了可讀性差之外,定義的遞歸lambda具有與直接調用自身的常規遞歸函數相比的應用程序開銷。那麼我在哪裏實際上需要遞歸lambdas和fix
?Haskell的遞歸函數與遞歸lambdas
我有點困惑。在Haskell中定義普通的遞歸函數沒有問題。同時還有標準的fix
函數用於通過固定點定義遞歸lambda表達式。但是除了可讀性差之外,定義的遞歸lambda具有與直接調用自身的常規遞歸函數相比的應用程序開銷。那麼我在哪裏實際上需要遞歸lambdas和fix
?Haskell的遞歸函數與遞歸lambdas
你從不需要它。不過,有時候這很方便。
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
塊的上下文中。