Skip to content

Type error reported in wrong place with repeated type family expressions

When I say

{-# LANGUAGE TypeFamilies #-}

type family F x
type instance F Int = Bool

foo :: F Int -> ()
foo True = ()

bar :: F Int -> ()
bar 'x' = ()

I get

/Users/rae/temp/Bug.hs:7:5:
    Couldn't match type ‘Char’ with ‘Bool’
    Expected type: F Int
      Actual type: Bool
    In the pattern: True
    In an equation for ‘foo’: foo True = ()

/Users/rae/temp/Bug.hs:10:5:
    Couldn't match type ‘Bool’ with ‘Char’
    Expected type: F Int
      Actual type: Char
    In the pattern: 'x'
    In an equation for ‘bar’: bar 'x' = ()

The second error is most certainly correct, but the first one is most certainly not. Note that the first error is reported on the definition of foo, which should type-check. Also, the "Couldn't match ..." bit doesn't correspond at all with the expected/actual bit. And, the expected/actual bit shows two types that are in fact equal.

This behavior can be seen in HEAD (as of Jul. 2), 7.8.3, and 7.8.2. This is a regression from 7.6.3, where this behavior does not appear.

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