为什么 Haskell 函数尾部包含整个列表?

问题描述 投票:0回答:1

简介和背景

在 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的回答非常有趣:“[...]任何集合都是其自身的子集[..]”

haskell functional-programming haskell-prelude
1个回答
0
投票

正如

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) []
将返回一个空列表。

© www.soinside.com 2019 - 2024. All rights reserved.