3 回答

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
語法[e1, e2 .. e3]實(shí)際上是語法糖enumFromThenTo e1 e2 e3,它是Enum類型類中的一個(gè)函數(shù)。
Haskell標(biāo)準(zhǔn)定義了它的語義如下:
對(duì)于類型Int和Integer,枚舉函數(shù)具有以下含義:
序列enumFrom e1是列表[e1,e1 + 1,e1 + 2,…]。
序列enumFromThen e1 e2是列表[e1,e1 + i,e1 + 2i,…],其中增量i為e2 ? e1。增量可以是零或負(fù)數(shù)。如果增量為零,則所有列表元素都相同。
序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,…e3]。如果列表是空的e1 > e3。
序列enumFromThenTo e1 e2 e3是列表[e1,e1 + i,e1 +
2i,…e3],其中增量i為e2 ? e1。如果增量為正或零,則列表在下一個(gè)元素大于時(shí)終止e3; 如果列表是空的e1 > e3。如果增量為負(fù),則列表在下一個(gè)元素小于時(shí)終止 e3; 如果列表是空的e1 < e3。
這幾乎是您所期望的,但是Float和Double實(shí)例的定義不同:
對(duì)于Float和Double,系列的語義enumFrom由Int上面的規(guī)則給出,除了當(dāng)元素變得大于e3 + i∕2正增量時(shí)i,或者當(dāng)它們變得小于e3 + i∕2負(fù)數(shù)時(shí),列表終止i。
我不確定這是什么理由,所以我能給你的唯一答案就是這樣,因?yàn)樗跇?biāo)準(zhǔn)中就是這樣定義的。
您可以通過使用整數(shù)枚舉并轉(zhuǎn)換為之Float后來解決此問題。
Prelude> map fromIntegral [1, 3 .. 10] :: [Float]
[1.0,3.0,5.0,7.0,9.0]

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
這樣的總和通常也會(huì)在省略最后一項(xiàng)時(shí)給出錯(cuò)誤的結(jié)果; 只有在特殊情況下sqrt (1 - 1)
才會(huì)這樣。我再次爭辯說明顯錯(cuò)誤的 NaN比一個(gè)聽起來不錯(cuò)的訂單0不準(zhǔn)確的浮點(diǎn)數(shù)更不好。 - 要確定這樣的東西,使用可能觸及域邊界的浮動(dòng)只是從根本上說是錯(cuò)誤的方法; 一個(gè)應(yīng)該計(jì)算單元格中點(diǎn),或者僅使用范圍語法用于單元間邊界,但是分別添加精確的外部邊界。
添加回答
舉報(bào)