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)
等也是如此。
要创建一个包含 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)
等也是如此。