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

On Tue, Apr 21, 2009 at 9:42 AM, Joe Fredette <jfredett@gmail.com> wrote:
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