
When you declare a type signature such as
f :: C x => a -> b
there is an implicit "forall":
f :: forall x. C x => a -> x
That is, the type signature must hold *for all* x such that C x holds.
However, in your case, it only holds for String – while A String does hold,
that is irrelevant, because the type signature states that it must hold for
*any* x such that A x that the caller wants. To put it another way, the
caller decides the "b" in that type signature, not the function
implementation.
What you want is something like
f :: exists x. C x => a -> x
so that f will return some unknown value such that you know it is an
instance of C x.
Hope that helps,
Andrew
On Tue, Nov 11, 2014 at 12:59 PM, Larry Lee
Hi
I have a very simple problem. I have a class and want to define a function in that class that returns a different instance of the same class.
I tried accomplishing this as follows:
class A a where f :: A b => a -> b
This fails however when I try to instantiate it. For example:
instance A String where f x = x
I get an error message that makes absolutely no sense to me:
src/CSVTree.hs:12:9: Could not deduce (b ~ [Char]) from the context (A b) bound by the type signature for f :: A b => String -> b at src/CSVTree.hs:12:3-9 `b' is a rigid type variable bound by the type signature for f :: A b => String -> b at src/CSVTree.hs:12:3 In the expression: x In an equation for `f': f x = x In the instance declaration for `A String' make: *** [compile] Error 1
Can someone please explain: how I can achieve my goal; and why my code is failing; simply and in plain English.
Thanks, Larry _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe