[Haskell-cafe] Counterintuitive ScopedTypeVariables behaviour

Viktor Dukhovni ietf-dane at dukhovni.org
Wed Aug 19 20:13:53 UTC 2020


On Sun, Aug 16, 2020 at 01:17:11PM +0100, Tom Ellis wrote:

>     -- Inferred signature:
>     -- add :: Num a => a -> a -> a
>     add (x :: a) (y :: b) = x + y
> [...]
> 
> But this leads to a rather puzzling user experience.  Was it really
> not possible to design this extension in a way that would allow
> bringing new type variables into scope locally but not allow them to
> unify with other type variables from outer scopes?

Back to Tom's original question, the answer is "no" because in fact no
unification of `a` and `b` is taking place.  The type variables `a` and
`b` in the above lexical Pattern Type Signatures are not "generalised":

    http://downloads.haskell.org/ghc/8.10.1/docs/html/users_guide/glasgow_exts.html#pattern-type-signatures

    Unlike expression and declaration type signatures, pattern type
    signatures are not implicitly generalised.

So what the example definition of `add` says (beyond giving a formula
for add x y) is that also the lexical type variables `a` and `b`
satisfy:

    a ~ TypeOf(x)
    b ~ TypeOf(y)

but since we've already inferred: TypeOf(x) ~ TypeOf(y), bringing `a`
and `b` into scope does not change that in any way.

-- 
    Viktor.


More information about the Haskell-Cafe mailing list