Haskell 中的长度 vs 头部 vs 最后

length vs head vs last in Haskell

我知道这些陈述中有 2 个是正确的,但我不知道哪个

e[Int]

类型的表达式
  1. 存在 e 这样:head e 的计算不会完成,但 last e

  2. 存在 e 这样:last e 的计算不会完成,但 head e

  3. 存在 e 这样:length e 的计算不会完成,但 last e

我很清楚 2 是正确的,但我看不出 1 或 3 怎么可能是正确的。

我的想法是,为了计算列表的长度,您需要到达最后一个列表,使 1 和 3 成为不可能

由于是一道试题,我就不直接回答了,这里给出一些提示;如果你自己解决这个问题会更好。

由于我们讨论的是不会终止的计算,因此定义一种这样的计算可能会很有用。但是,如果这让您感到困惑,您可以安全地忽略它并仅参考不包含它的示例。

-- `never` never terminates when evaluated, and can be any type.
never :: a
never = never

问题 1

考虑列表 [never, 1],或者考虑@chi 建议的列表 [last [1..], 1]


问题 2

考虑列表 [1..],或者列表 [1, never]


问题 3

考虑length的定义:

length [] = 0
length (_:xs) = 1 + length xs

在什么情况下 length 不会终止?这与 last 有什么关系?