递归函数与哈斯克尔中的递归 lambda



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

你永远不需要它。不过,有时它稍微方便。

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

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

最新更新