2014-02-21 26 views
2

我從「Learn you a Haskell」開始學習Haskell。在列表中使用範圍運算符會導致無限擴展

我正在查看列表並使用範圍構建它們。

我會就在想,如果我有一個像

[2,4..20] 

列表哈斯克爾確實是讓前兩個元素之間的差異,然後添加到4中得到後續的價值是什麼?

這將我帶到下一點。我嘗試[1,1..20],並導致一個永不結束的列表擴展,因爲1-1 = 0,所以沒有算術級數。

我的想法是否正確?

+0

正確,終止條件永遠不會成立。這將相當於[1,1 ..] – karakfa

回答

7

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,該列表是空的。

所以,是的,你說的完全正確。

2

該語法其實只是使用Enum typeclass,它實際上與數字或差異無關。如果您有自己的Enum類型,則可以使用列表擴展。什麼是使用的卻是功能

enumFrom :: a -> [a] 
enumFromThen :: a -> a -> [a] 
enumFromTo :: a -> a -> [a] 
enumFromThenTo :: a -> a -> a -> [a] 

對於IntInteger類型,您所描述的算術本質的實現。