要创建5个数字的列表,可以采用以下方法:
[1..5]
也可以从最高到最低开始:
[5,4..1]
但没有意义的是,如果您要创建一个列表,那么您将获得一个空列表:
[5..1]
是否可能有一个解释为什么为最后一个片段返回一个空列表?对我来说,为什么你必须指定每个数字之间的差距是没有意义的,就像上面的第二个片段一样。
如果它从最低到最高,我会认为使语言从最高到最低都不会太难。是否存在潜在的原因,为什么Haskell不允许这样做,可能是漏洞问题?
答案 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的一部分。