[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