Haskell-列表混乱

Haskell-list confusion

要创建一个包含 5 个号码的列表,可以执行以下操作:

[1..5]

也可以从大到小开始:

[5,4..1]

但是没有意义的是,如果您要这样创建一个列表,您会得到一个空列表:

[5..1]

是否可以解释为什么最后一个片段返回空列表?我不明白为什么你必须指定每个数字之间的差距,就像上面的第二个片段一样。

如果它按从低到高的顺序工作,我认为让语言按从高到低的顺序工作不会太难。 Haskell 不允许这样做是否有根本原因,也许是漏洞问题?

来自Wikibooks,算术序列被脱糖为:

[1..5]   → enumFromTo 1 5
[1,3..9] → enumFromThenTo 1 3 9
[1..]    → enumFrom 1
[1,3..]   → enumFromThen 1 3

因此 [5,4..1] 被脱糖为 enumFromThenTo 5 4 1,但 [5..1] 被脱糖为 enumFromTo 5 1

您可以根据自己的数据类型定义它们。这些函数是 Enum type-class.

的一部分

[n..m] 列表列举了 x 的数字 n <= x && x <= m。如果 m<n,则不存在这样的 x,因此结果为空。

请注意,此约定有助于翻译惯用的命令式循环

// Does nothing if m<n
for (int x=n; x <= m ; x++) { ... }

可以转化为

map (...) [n..m]   -- or foldr, or ...

甚至

forM_ [n..m] $ \x -> ...

此约定与其他一些语言共享,例如Python,其中 range(n,m) 大致相当于 [n..m-1]。的确,range(1,1)是空的,range(1,0)range(1,-1)等也是如此。