Haskell列表混乱

时间:2015-01-30 04:25:26

标签: haskell

要创建5个数字的列表,可以采用以下方法:

[1..5]

也可以从最高到最低开始:

[5,4..1]

但没有意义的是,如果您要创建一个列表,那么您将获得一个空列表:

[5..1]

是否可能有一个解释为什么为最后一个片段返回一个空列表?对我来说,为什么你必须指定每个数字之间的差距是没有意义的,就像上面的第二个片段一样。

如果它从最低到最高,我会认为使语言从最高到最低都不会太难。是否存在潜在的原因,为什么Haskell不允许这样做,可能是漏洞问题?

2 个答案:

答案 0 :(得分:4)

[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)等等。

答案 1 :(得分:3)

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的一部分。