Skip to content

Type checking regression

This module:

{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverlappingInstances #-}

module HTk.Toolkit.TreeList (getObjectFromTreeList) where

class Eq c => CItem c

data StateEntry a = StateEntry (TreeListObject a)
                               a -- Comment this 'a' out and it type checks
    deriving Eq

getObjectFromTreeList :: CItem a => [StateEntry a] -> Bool
getObjectFromTreeList state = (head state == head state)

data CItem a => TreeListObject a

instance CItem a => Eq (TreeListObject a)

class GUIObject w where
  toGUIObject     :: w -> GUIOBJECT

instance GUIObject w => Eq w where
  w1 == w2 = toGUIObject w1 == toGUIObject w2

data GUIOBJECT

instance Eq GUIOBJECT where
  (==) = undefined
  (/=) = undefined

is accepted by 7.0.1, but not by 7.0-branch or HEAD:

Q.hs:16:43:
    Could not deduce (GUIObject a) arising from a use of `=='
    from the context (CItem a)
      bound by the type signature for
                 getObjectFromTreeList :: CItem a => [StateEntry a] -> Bool
      at Q.hs:16:1-56
    Possible fix:
      add (GUIObject a) to the context of
        the type signature for
          getObjectFromTreeList :: CItem a => [StateEntry a] -> Bool
    In the expression: (head state == head state)
    In an equation for `getObjectFromTreeList':
        getObjectFromTreeList state = (head state == head state)

If you comment out the a then it is accepted by all 3.

Trac metadata
Trac field Value
Version 7.0.1
Type Bug
TypeOfFailure OtherFailure
Priority highest
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