在 Haskell 中,我们有函数
tail
提供列表的后缀。
例如:
tail [1,2,3]
给予
[2, 3]
函数 tails 将给出所有后缀:
tails [1,2,3]
给予
[[1,2,3],[2,3],[3],[]]
为什么它返回整个列表作为第一个参数?我期望返回所有真实的后缀,即我期望的
tails [1,2,3]
给予
[[2,3],[3],[]]
或者甚至
[[2,3],[3]]
没有空列表。
尾部以这种方式表现是否有形式/逻辑原因,还是只是随机的,即它在原始实现中如何工作并且从未改变?
我搜索了周围的问题,但没有找到合适的解释。
编辑:
我发现@Chi的回答非常有趣:“[...]任何集合都是其自身的子集[..]”
tails :: [a] -> [[a]]
[Hackage] 上的文档所述:
tails 函数返回参数的所有最终段,最长的在前。
so all 后缀。列表始终是其自身的后缀。
tails
本质上实现为:
tails :: [a] -> [[a]]
tails [] = [[]]
tails xs@(_:xs') = xs : tails xs'
因此返回列表本身,以及其尾部的
tails
(如果有)。如果您只对strict尾巴感兴趣,我们可以使用故事的tail:
tail . tails
保证可以工作,因为对于空列表,
tails []
将返回一个单例列表,因此(tail . tails) []
将返回一个空列表。