[Haskell-cafe] A voyage of undiscovery
Robert Greayer
robgreayer at gmail.com
Thu Jul 16 14:58:15 EDT 2009
On Thu, Jul 16, 2009 at 2:34 PM, Andrew
Coppin<andrewcoppin at btinternet.com> wrote:
> I've been working hard this week, and I'm stumbled upon something which is
> probably of absolutely no surprise to anybody but me.
>
> Consider the following expression:
>
> (foo True, foo 'x')
>
> Is this expression well-typed?
>
> Astonishingly, the answer depends on where "foo" is defined. If "foo" is a
> local variable, then the above expression is guaranteed to be ill-typed.
This isn't completely accurate:
f0 _ = (foo True, foo 'x') where foo = id
is well-typed.
whereas
f1 foo = (foo True, foo 'x')
requires 'foo' to be polymorphic in its first argument. This does
require a higher rank type, which
can't be inferred:
You could type f1 as
f1 :: (forall a . a -> a) -> (Bool, Char)
and apply it to 'id'.
Or you could type it as something like:
f1 :: (forall a . a -> ()) -> ((),())
and apply it to 'const ()'
More information about the Haskell-Cafe
mailing list