我對Haskell很新。有人可以解釋爲什麼定義這樣的列表返回一個空列表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]
我對Haskell很新。有人可以解釋爲什麼定義這樣的列表返回一個空列表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]
基本上,因爲[10..1]
被轉換爲enumFromTo 10 1
本身具有的語義通過取所有元素低於1
從(包括)10
向上計數(具有步長+1
),其導致創建列表。
鑑於[10, 9..1]
被轉換爲enumFromToThen 10 9 1
其中明確規定的計數步長作爲9-10
,即-1
(它是硬編碼到+1
爲enumFromTo
)
更精確的規範可以在Haskell的報告中找到( 6.3.4枚舉類):
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
,枚舉函數甲肝E以下含義:
序列
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
。
算術序列符號僅僅是用於從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]
會走向哪個方向。
它有更好的數學性質來推理。您不必爲順序顛倒時添加特殊情況。
謝謝你,這是有道理的。乍一看,我認爲這是非常愚蠢的表示,但我現在可以看到,它可以定義範圍內的步驟的大小。很酷!非常興奮Haskell現在:) – Christopher