[Haskell-beginners] Addition of "Float" and "Int".

Mateusz Kowalczyk fuuzetsu at fuuzetsu.co.uk
Tue May 13 23:17:52 UTC 2014


On 05/12/2014 05:44 PM, Venu Chakravorty wrote:
> 
> 
> Hello everyone,
> 	I am just starting with Haskell so please bear with me.
> 
> 
> Here's my question:
> 
> 
> Consider the below definition / output:
> 
> 
> Prelude> :t (+)
> (+) :: (Num a) => a -> a -> a
> 
> 
> 	What I understand from the above is that "+" is a function that takes two args
> which are types of anything that IS-AN instance of "Num" (Int, Integer, Float, Double)
> and returns an instance of "Num".
> Hence this works fine:
> Prelude> 4.3 + 2
> 6.3
> 
> 
> But I can't understand why this doesn't work:
> Prelude> 4.3 + 4 :: Int
> 
> 
> <interactive>:1:0:
>     No instance for (Fractional Int)
>       arising from the literal `4.3' at <interactive>:1:0-2
>     Possible fix: add an instance declaration for (Fractional Int)
>     In the first argument of `(+)', namely `4.3'
>     In the expression: 4.3 + 4 :: Int
>     In the definition of `it': it = 4.3 + 4 :: Int
> 
> 
> 	I expected that the second addition would work as both "Float" and "Int" are
> instances of "Num". Is it that since both the formal args are defined as "a" they
> have to be exactly the same instances? Had "+" been defined something like: 
> (+) :: (Num a, Num b) => a -> b -> a
> my second addition would have worked?
> 

Just to follow up on the part Brandon didn't explain, no, (Num a, Num b)
=> a -> b -> a would not work either: there is not enough information
there to do anything sensible. That is, we don't know how to turn any
arbitrary Num into any other arbitrary Num.

What if it was (4 :: Int) + (7.5 :: Double). The type signature would
match but the result is fractional and we promised to return Int.

This is the reason why it's Num a => a -> a -> a; we only know how to
add things of the same type together. If we want more, we need to have
more information.

> Please let me know what I am missing.
> 
> 
> Regards,
> Venu Chakravorty.
> 
> 
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
> 


-- 
Mateusz K.


More information about the Beginners mailing list