[Haskell-cafe] Re: checking types with type families
Dan Doel
dan.doel at gmail.com
Fri Jul 2 18:37:08 EDT 2010
On Friday 02 July 2010 6:23:53 pm Claus Reinke wrote:
> -- second, while trying the piece with classic, non-equality constraints
> Prelude> (id :: (forall b. Eq b=>b->b) -> (forall b. Eq b=>b->b))
>
> <interactive>:1:0:
> No instance for (Show ((forall b1. (Eq b1) => b1 -> b1) -> b -> b))
> arising from a use of `print' at <interactive>:1:0-55
> Possible fix:
> add an instance declaration for
> (Show ((forall b1. (Eq b1) => b1 -> b1) -> b -> b))
> In a stmt of an interactive GHCi command: print it
>
> Note that the second version goes beyond the initial problem,
> to the missing Show instance, but the error message loses the
> Eq constraint on b!
>
> -- it is just the error message, the type is still complete
> Prelude> :t (id :: (forall b. Eq b=>b->b) -> (forall b. Eq b=>b->b))
> (id :: (forall b. Eq b=>b->b) -> (forall b. Eq b=>b->b))
>
> :: (Eq b) => (forall b1. (Eq b1) => b1 -> b1) -> b -> b
>
> I don't have a GHC head at hand, perhaps that is doing better?
I don't think this is a big deal. For instance:
Prelude> :t id :: Eq b => b -> b
id :: Eq b => b -> b :: (Eq b) => b -> b
Prelude> id :: Eq b => b -> b
<interactive>:1:0:
No instance for (Show (b -> b))
arising from a use of `print' at <interactive>:1:0-19
Possible fix: add an instance declaration for (Show (b -> b))
In a stmt of a 'do' expression: print it
The Eq constraint is irrelevant to the fact that there is no b -> b Show
instance. The search for an instance looks only at the type part, and if it
finds a suitable match, then checks if the necessary constraints are also in
place.
What's happening in your example is that the type:
(forall b. Eq b => b -> b) -> (forall b. Eq b => b -> b)
is being changed to the isomorphic type:
forall b. Eq b => (forall b. Eq b => b -> b) -> b -> b
And then the instance search only looks at the part after the first =>, which
fails to match any Show instances.
-- Dan
More information about the Haskell-Cafe
mailing list