Haskell的长度vs头部vs最后

时间:2018-06-20 18:25:00

标签: haskell functional-programming declarative

我知道其中两个陈述是正确的,但我不知道哪个

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变得不可能

1 个答案:

答案 0 :(得分: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有什么关系?