Thank you.
I get the following error after making the suggested changes
-- foo.hs
{-# LANGUAGE FlexibleInstances #-}
module Foo where
class Foo a where
bar :: a -> a
--
-- instance Foo Int where
-- bar i = i + 10
--
-- instance Foo [Char] where
-- bar m = "foo" ++ m
--
instance Num a => Foo a where
bar x = x + 10
-----
foo.hs:14:0:
Constraint is no smaller than the instance head
in the constraint: Num a
(Use -XUndecidableInstances to permit this)
In the instance declaration for `Foo a'
Failed, modules loaded: none.
Prelude>
...Amitava
If I'm not mistaken, changing:
bar i = i + 10
to
bar i = i + 10::Int
ought to fix it.
The issue is that the compiler is being to general wrt the type of "10", it's inferring that it's just of type (Num a => a) -- the type of all numbers (sortof.)
Alternately, you could implement this as:
instance Num a => Foo a where
bar x = x + 10
which similarly ought to fix it. Do you understand why?
Amitava Shee wrote:
------------------------------------------------------------------------I have the following code
-- foo.hs
module Foo where
class Foo a where
bar :: a -> a
instance Foo Int where
bar i = i + 10
------------------
It fails to compile withe following error
*Foo> bar 10
<interactive>:1:4:
Ambiguous type variable `t' in the constraints:
`Num t' arising from the literal `10' at <interactive>:1:4-5
`Foo t' arising from a use of `bar' at <interactive>:1:0-5
Probable fix: add a type signature that fixes these type variable(s)
*Foo>
- Thanks
Amitava Shee
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners