Haskell 中的长度 vs 头部 vs 最后
length vs head vs last in Haskell
我知道这些陈述中有 2 个是正确的,但我不知道哪个
设 e
为 [Int]
类型的表达式
存在 e
这样:head e
的计算不会完成,但 last e
会
存在 e
这样:last e
的计算不会完成,但 head e
会
存在 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
有什么关系?
我知道这些陈述中有 2 个是正确的,但我不知道哪个
设 e
为 [Int]
存在
e
这样:head e
的计算不会完成,但last e
会存在
e
这样:last e
的计算不会完成,但head e
会存在
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
有什么关系?