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

MJ Williams matthewjwilliams101 at gmail.com
Wed May 14 09:07:55 UTC 2014


I'm sure someone else on this list will explain it much more 
eloquently than I, but for now, here goes:
What you are effectively forcing haskell to do is to return a result 
that hasn't been defined.  You can't force a result of type `Int' 
where `+' has not been defined to return such a result for the sum of 
a Float(s) and integers(s).  Of course, in languages such as C you 
can use casting for the purpose, but we are talking about very 
different, in fact, entirely different programming paradigms.

hth,
Matthew
At 00:17 14/05/2014, you wrote:
>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.
>_______________________________________________
>Beginners mailing list
>Beginners at haskell.org
>http://www.haskell.org/mailman/listinfo/beginners



More information about the Beginners mailing list