Skip to content

Type variables allowed to unify in a partial type signature (PartialTypeSignatures)

During a discussion today, Richard discovered the following bug:

The function f is accepted in GHC 8.2.1 (and HEAD too):

{-# LANGUAGE PartialTypeSignatures #-}

f :: a -> b -> _
f x y = [x, y]

with the warning:

Bug.hs:3:16: warning: [-Wpartial-type-signatures]
    • Found type wildcard ‘_’ standing for ‘[a]’
      Where: ‘a’ is a rigid type variable bound by
               the inferred type of f :: a -> a -> [a] at Bug.hs:4:1-13
    • In the type signature: f :: a -> b -> _
  |
3 | f :: a -> b -> _
  |                ^
Ok, 1 module loaded.

This is a regression compared to 8.0.1, where the following error is produced (rightly):

Bug.hs:4:12: error:
    • Couldn't match expected type ‘a’ with actual type ‘b’
      ‘b’ is a rigid type variable bound by
        the inferred type of f :: a -> b -> [a]
        at Bug.hs:3:6
      ‘a’ is a rigid type variable bound by
        the inferred type of f :: a -> b -> [a]
        at Bug.hs:3:6
    • In the expression: y
      In the expression: [x, y]
      In an equation for ‘f’: f x y = [x, y]
    • Relevant bindings include
        y :: b (bound at Bug.hs:4:5)
        x :: a (bound at Bug.hs:4:3)
        f :: a -> b -> [a]
          (bound at Bug.hs:4:1)
Failed, modules loaded: none.

Note that the inferred type of f is still correct: f :: a -> a -> a, but the type variables a and b are allowed to unify during inference, and they shouldn't be. If I understood correctly, this implies that when inferring the type of functions with partial type signatures, the type variables are (wrongly) treated as SigTvs, instead of skolem constants.

Trac metadata
Trac field Value
Version 8.2.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC goldfire, simonpj
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information