Possible Duplicate:
Haskell ranges and floats
如果我像这样在 ghci 中生成一个列表
let a = [0.1,1..10]
这给了我一个包含以下条目的列表
[0.1,1.0,1.9,2.8,3.6999999999999997,4.6,5.5,6.4,7.300000000000001,8.200000000000001,9.100000000000001,10.000000000000002]
列表的最后一个元素是 10.000000000000002,我认为这只是由于浮点使用所致。然而,与数字 10 相比,结果似乎不一致,例如,
last a > 10
True
last a < 10
False
如果最终元素小于或等于 10,为什么列表创建不进行比较?
最佳答案
Arithmetic sequences根据 reference implementation of the Prelude,当值大于最终值加 1/2 时, float 停止。 :
numericEnumFrom :: (Fractional a) => a -> [a]
numericEnumFromThen :: (Fractional a) => a -> a -> [a]
numericEnumFromTo :: (Fractional a, Ord a) => a -> a -> [a]
numericEnumFromThenTo :: (Fractional a, Ord a) => a -> a -> a -> [a]
numericEnumFrom = iterate (+1)
numericEnumFromThen n m = iterate (+(m-n)) n
numericEnumFromTo n m = takeWhile (<= m+1/2) (numericEnumFrom n)
numericEnumFromThenTo n n' m = takeWhile p (numericEnumFromThen n n')
where
p | n' >= n = (<= m + (n'-n)/2)
| otherwise = (>= m + (n'-n)/2)
至于为什么,你必须询问委员会,但很可能他们不希望范围最终“不完整”,并且认为它有点太大会不那么不直观。对于浮点,它总是会是其中之一。
关于haskell - 浮点列表生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810002/