這個問題在這里已經有了答案: Haskell 范圍和浮點數 2 個回答 9 天前關閉。
我發現[0.1..1]將從 Haskell 回傳的串列,我不明白為什么會這樣[0.1,1.1]。誰能為我解釋一下?
uj5u.com熱心網友回復:
TL;DR:不要[x..y]在浮點數上使用。你可能會得到意想不到的結果。
在浮點數上, 沒有合理的語意[x..y]。例如,有人可能會爭辯說,語意應該是那個形式的最大值[x,x 1,x 2,...,x n]where x nis <=y。但是,這不考慮浮點舍入誤差。可能會x n產生比精確值稍大的值y,從而使串列比預期的要短。因此,這種語意使得 的價值length [x..y]相當不可預測。
Haskell 試圖通過允許最多0.5. 基本原理如下:當x n更接近y,而不是y 1,它應該算是在間隔一定的價值[x..y]它得到了四舍五入至更大的東西。有爭議,但這就是 Haskell 的作業方式。
在像[x,y .. z]顯式步進(例如[0.0,5.0 .. 1000.0])的列舉中,Haskell 反而允許錯誤(y-x)/2(2.5在示例中)。基本原理是相同的:我們包括那些1000比更接近 的點1000 5。
您可以在定義 Haskell 語意的Haskell 報告中找到所有血腥細節。這部分也是相關的。
這通常被 Haskellers 視為語言中的一個小問題。一些人爭辯說,我們不應該強制要求Enum Float和Enum Double。洗掉這些實體將有效地阻止麻煩的情況,例如[1.0 .. 5.0]或更糟的情況[1.0 .. 5.5](這在數值上再次不穩定)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316844.html
上一篇:如何優化Haskell代碼以通過HackerRanks超時測驗用例(不適用于任何正在進行的比賽,只是我練習)
下一篇:Haskell超型別和子型別
