我只是盯著 Haskell 閱讀http://learnyouahaskell.com 的書。在 Texas Ranges 部分,作者展示了使用此語法 [x,y..z] 指定范圍中的步驟的代碼,我使用示例 [2,4..20] 做到了這一點,它運行順利,但是當我運行 [2,2..20] 我得到一個 2 的無限串列,而不是 [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17、18、19、20]。如果我運行 [2,3..20] 我會得到所需的輸出,所以我假設串列的第一個值為 2 存在某種問題,我想要一個更技術性的回應,確切地解釋為什么會這樣不允許。控制臺圖片
uj5u.com熱心網友回復:
但是當我跑步時,
[2,2..20]我得到了一個無限的2s串列
這是預期的行為。事實上,對于一個范圍,第一個數字確定開始值之間的差和確定步驟,以及確定所述上界。由于步長為,它將繼續產生s,并且永遠不會產生大于上限的值。[x, y .. z]xyxz0220
如果你寫的,這是翻譯成并作為哈斯克爾報告§6.3.4說:[e1, e2 .. e3]enumFromThenTo e1 e2 e3
序列是串列 [ e 1 , e 1 i , e 1 2 i ,… e 3 ],其中增量i是e 2 - e 1。如果增量為正數或零,則串列在下一個元素大于e 3時終止;如果e 1 > e 3 ,則串列為空。如果增量為負,則串列在下一個元素小于e 3時終止;如果e 1,則串列為空
enumFromThenTo e1 e2 e3< ? 3。
uj5u.com熱心網友回復:
[2,4..10] 是 [2, 4, 6, 8, 10]
[2,3..10] 是 [2, 3, 4, 5, 6, 7, 8, 9, 10]
你能看到圖案嗎?Haskell 范圍語法的設計看起來有點像您用普通語言撰寫的;剛好足夠串列的開頭來建立一個模式,然后..瀏覽只是繼續模式的中間元素,然后最后一個元素知道在哪里停止。
它不是 [start, step .. stop]1 ; 而是它[first, second .. final]。
因此,考慮到[2, 2 .. 20]這一點,很明顯這是一個以 2 開頭的串列,然后是 2,然后是 2,然后我們應該從那里繼續。但是如果規則是 2 跟隨 2,那么概括地說,我們只有一個無限的 2 串列(當我們達到 20 時會停止,但我們永遠不會達到 20)。
Willem Van Onsem 的回答出色地給出了準確的技術定義,包括規范參考。但這就是它的動機。
1在我看來,如果是這樣,那真的很奇怪。確實,其他語言通常通過在其標準庫2 中提供 start、stop 和 step 函式來滿足這種需求,但它們通常使用函式來實作;類似的東西range(start, stop, step=1)。[start, step .. stop]作為特殊用途的語法來做到這一點會非常混亂。Haskell 的存在[first, second .. final] 只是為了看起來像撰寫范圍而不是函式呼叫的“自然”方式。如果它看起來不像自然符號,我們就會有一個函式。
2雖然也許這甚至不是你心目中的事情,因為你顯然得到了你從預期的[2, 2 .. 20]有[2, 3 .. 20],但畢竟是start = 2, step = 1, stop = 20。如果我誤解了您的誤解,請道歉!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370712.html
標籤:哈斯克尔
