我对Haskell很新。有人可以解释为什么定义这样的列表会返回一个空列表
ghci> let myList = [10..1]
ghci> myList
[]
然而,这可以正常工作。
ghci> let myList = [10, 9..1]
ghci> myList
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
答案 0 :(得分:36)
基本上,因为[10..1]
被翻译为enumFromTo 10 1
,它本身具有创建列表的语义,方法是将所有小于1
的元素从向上计数(步长) +1
)来自(包括)10
。
[10, 9..1]
被转换为enumFromToThen 10 9 1
,明确指出计数步长为9-10
,即-1
(硬编码为+1
对于enumFromTo
)
更准确的规范可以在Haskell报告(6.3.4 Enum类)中找到:
enumFrom :: a -> [a] -- [n..]
enumFromThen :: a -> a -> [a] -- [n,n'..]
enumFromTo :: a -> a -> [a] -- [n..m]
enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
对于类型
Int
和Integer
,枚举函数具有以下含义:
序列
enumFrom e1
是列表[e1,e1+1,e1+2,...]
。序列
enumFromThen e1 e2
是列表[e1,e1+i,e1+2i,...]
,其中增量i为e2-e1。增量可以是零或负数。如果增量为零,则所有列表元素都相同。- ,该列表为空
序列
enumFromTo e1 e3
是列表[e1,e1+1,e1+2,...e3]
。如果e1 > e3
。- ,则列表为空
序列
enumFromThenTo e1 e2 e3
是列表[e1,e1+i,e1+2i,...e3]
,其中增量i
为e2-e1
。如果增量为正或零,则当下一个元素大于e3
时,列表终止;如果e1 > e3
,则列表为空。如果增量为负,则当下一个元素小于e3
时,列表终止;如果e1 < e3
。
答案 1 :(得分:11)
算术序列表示法只是Enum
类函数的语法糖。
[a..] = enumFrom a
[a..b] = enumFromTo a b
[a, b..] = enumFromThen a b
[a, b..c] = enumFromThenTo a b c
至于为何他们没有被定义为自动撤销,我只能推测,但这里有一些可能的原因:
如果在其他地方定义了a
和b
,则很难一目了然地指出[a..b]
的方向。
它有更好的数学属性来推理。您不必为序列反转时添加特殊情况。
答案 2 :(得分:2)
如果您想生成从DOMImplementation domImpl = doc.getImplementation();
DocumentType doctype = domImpl.createDocumentType("");
doc.appendChild(doctype);
到a
的列表,无论是否b
,您都可以使用以下内容:
a < b
答案 3 :(得分:1)
对于新手。
要列出从 20 到 1 的所有数字,您不能只做
[20..1]
你必须这样指定:
[20,19..1]