Haskell 列表上的递归如何工作

标签 haskell

我正在学习 Haskell,有人可以解释一下,为什么这个功能有效吗? 我的意思是,感应案例如何不会永远运行? 这里的停止条件是什么?

    myLength :: [a] -> Integer
    myLength []     = 0
    myLength (x:xs) = (+1) (myLength xs)

最佳答案

停止条件是列表用完,所以[]模式。在这种情况下,Haskell 将返回一个 0

在递归的情况下,我们因此匹配任何非空列表(x:xs),其中x是第一个元素,和 xs tail(剩余元素的列表)。在这种情况下,我们因此返回 1 + myLength xs,所以我们在尾部递归。

这意味着对于每一个有限列表,我们最终都会以[]为参数进行递归调用,从而返回0

因此,Python 中的等效算法如下所示:

def myLength(items):
    if <strong>len(items)</strong>:
        return myLength(<strong>items[1:]</strong>) + 1
    else:
        return 0

这里计算尾部需要 O(n),而在 Haskell 中需要 O(1)

关于Haskell 列表上的递归如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68912662/

相关文章:

haskell - 在 Haskell 中避免部分函数比其他语言更容易吗?

haskell - 将值映射转换为元组列表

list - Common Lisp 相当于 Haskell 的副本?

haskell - 如何使用检查器测试此应用实例? (没有 CoArbitrary 实例(验证 e0 [Char]))

haskell - 是否可以用递归方案比较两棵树?

haskell - 可重置累加器行为?

Haskell - 如何转换类型?

haskell - 是否可以在父类(super class)约束中引入额外的类型变量?

haskell - 在 Haskell 中删除具有特定 Int 的树叶

haskell - 使用来自类型级别 map 的额外信息装饰类型级别列表