[Haskell-beginners] typeclass error

Joe Fredette jfredett at gmail.com
Tue Apr 21 12:44:06 EDT 2009


Right, I was incorrect, you should use the solution that Quentin gave- 
to recap it,

The basic problem is that GHCi is trying to infer a single type -- 
called "monomorphic" -- for your more general type.
the type of `bar` is `Foo a => a -> a`, when ghci looks at a literal 
number (like 10) it interprets it as a "default" type of
Integer (not int). Since Integer does not instance Foo, then GHCi yells 
at you.

Quentin explained it far better than I, I refer you to his email.

/Joe

Amitava Shee wrote:
> 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 at gmail.com 
> <mailto:jfredett at 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 at haskell.org <mailto:Beginners at haskell.org>
>         http://www.haskell.org/mailman/listinfo/beginners
>          
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: jfredett.vcf
Type: text/x-vcard
Size: 296 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/beginners/attachments/20090421/b856729c/jfredett-0001.vcf


More information about the Beginners mailing list