如果我在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?
答案 0 :(得分:6)
Arithmetic sequences浮点数停止reference implementation of the Prelude:
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)
至于为什么,你必须要求委员会,但很可能他们不希望范围最终“不完整”,并认为它有点太大会不那么不直观。对于浮点,它总是会是一个或另一个。