我從「Learn you a Haskell」開始學習Haskell。在列表中使用範圍運算符會導致無限擴展
我正在查看列表並使用範圍構建它們。
我會就在想,如果我有一個像
[2,4..20]
列表哈斯克爾確實是讓前兩個元素之間的差異,然後添加到4中得到後續的價值是什麼?
這將我帶到下一點。我嘗試[1,1..20],並導致一個永不結束的列表擴展,因爲1-1 = 0,所以沒有算術級數。
我的想法是否正確?
我從「Learn you a Haskell」開始學習Haskell。在列表中使用範圍運算符會導致無限擴展
我正在查看列表並使用範圍構建它們。
我會就在想,如果我有一個像
[2,4..20]
列表哈斯克爾確實是讓前兩個元素之間的差異,然後添加到4中得到後續的價值是什麼?
這將我帶到下一點。我嘗試[1,1..20],並導致一個永不結束的列表擴展,因爲1-1 = 0,所以沒有算術級數。
我的想法是否正確?
Haskell Report是權威性的參考文獻。它具有這樣說arithmetic sequences:
翻譯:等差數列滿足這些身份:
[ e1.. ] = enumFrom e1 [ e1,e2.. ] = enumFromThen e1 e2 [ e1..e3 ] = enumFromTo e1 e3 [ e1,e2..e3 ] = enumFromThenTo e1 e2 e3
其中enumFrom,enumFromThen,enumFromTo和enumFromThenTo是在前奏中定義的類枚舉類方法(見圖6.1)。
因此,算術序列的語義完全取決於類型t的實例聲明。有關Enum中的Prelude類型及其語義的更多詳細信息,請參見第6.3.4節。
所以,我們應該去看看適當類型的enumFromThenTo
方法。假設我們在這裏討論Integer
。預定義的類型和類這一章有這樣說Enum
instances:
對於類型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,該列表是空的。
所以,是的,你說的完全正確。
該語法其實只是使用Enum
typeclass,它實際上與數字或差異無關。如果您有自己的Enum
類型,則可以使用列表擴展。什麼是使用的卻是功能
enumFrom :: a -> [a]
enumFromThen :: a -> a -> [a]
enumFromTo :: a -> a -> [a]
enumFromThenTo :: a -> a -> a -> [a]
對於Int
和Integer
類型,您所描述的算術本質的實現。
正確,終止條件永遠不會成立。這將相當於[1,1 ..] – karakfa