Это правильное поведение. Число 0.9
не представляется как Double
, не в Haskell, C или Java. Это потому, что Double
и Float
используют основание 2: они могут точно представлять только определенное подмножество двоичных дробей.
Чтобы получить желаемое поведение, импортируйте модуль Numeric
и используйте функцию readFloat
. Интерфейс довольно шаткий (используется тип ReadS
), поэтому вам придется немного обернуть его. Вот как это можно использовать:
import Numeric
myReadFloat :: String -> Rational -- type signature is necessary here
myReadFloat str =
case readFloat str of
((n, []):_) -> n
_ -> error "Invalid number"
И, результат:
> myReadFloat "0.9"
9 % 10