[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