Haskell just using the read function signals an error
Can anybody explain, why it is valid to read a number to add it to a another number, although reading just a number is not valid?
Prelude> read "5" + 3
8
Prelude> read "5"
:33:1:
No instance for (Read a0) arising from a use of `read'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Read () -- Defined in `GHC.Read'
instance (Read a, Read b) => Read (a, b) -- Defined in `GHC.Read'
instance (Read a, Read b, Read c) => Read (a, b, c)
-- Defined in `GHC.Read'
...plus 25 others
In the expression: read "5"
In an equation for `it': it = read "5"
Why is "5" ambiguous?
"5" itself is not ambiguous , it's more that Haskell does not know to what type you want to read . read is a function defined as:
read :: Read a => String -> a and you can define multiple types that support the Read class. For instance Int is an instance of Read , but also Float and you can define your own type that is an instance of Read . You could for instance have defined your own type:
data WeirdNumbers = Five | Twelve
and then define an instance Read WeirdNumbers where you map "5" on Five , etc. Now "5" thus maps on several types.
You can simply solve the problem by telling Haskell to what type you want to read. Like:
Prelude> read "5" :: Int
5
Prelude> read "5" :: Float
5.0
The reason why read "5" + 3 works by the way is because here you provide a 3 and a (+) :: Num a => a -> a -> a . So Haskell reasons "Well 3 is an Integer and + requires that the left and the right operand to be of the same type, I know I have to use read such that it reads to an Integer as well."
上一篇: 映射到字符串
