Ticket #2219 (closed bug: fixed)

Opened 5 years ago

Last modified 5 years ago

GADT match fails to refine type variable

Reported by: dolio Owned by: chak
Priority: normal Milestone: 6.10 branch
Component: Compiler (Type checker) Version: 6.9
Keywords: gadt type family Cc:
Operating System: Linux Architecture: x86
Type of failure: Difficulty: Unknown
Test Case: T2219 Blocked By:
Blocking: Related Tickets:

Description

The following code is accepted by the type checker in 6.8.2, but is rejected by a HEAD build, 6.9.20080411:

{-# LANGUAGE TypeFamilies, GADTs, EmptyDataDecls, TypeOperators #-}

data Zero
data Succ a

data FZ
data FS fn

data Fin n fn where
  FZ :: Fin (Succ n) FZ
  FS :: Fin n fn -> Fin (Succ n) (FS fn)

data Nil
data a ::: b

type family Lookup ts fn :: *
type instance Lookup (t ::: ts) FZ = t
type instance Lookup (t ::: ts) (FS fn) = Lookup ts fn

data Tuple n ts where
  Nil   :: Tuple Zero Nil
  (:::) :: t -> Tuple n ts -> Tuple (Succ n) (t ::: ts)

proj :: Fin n fn -> Tuple n ts -> Lookup ts fn
proj FZ      (v ::: _)  = v
proj (FS fn) (_ ::: vs) = proj fn vs

The error in question is:

Bug.hs:25:16:
    Occurs check: cannot construct the infinite type:
      t = Lookup (t ::: ts) fn
    In the pattern: v ::: _
    In the definition of `proj': proj FZ (v ::: _) = v

Which seems to indicate that the pattern match against FZ in the first case is failing to refine the type variable fn to FZ. Reversing the order of the cases yields the same error, so either the match against FS is working correctly, or the type checker thinks that it can solve Lookup (t ::: ts) fn ~ Lookup ts fn.

Change History

Changed 5 years ago by chak

  • owner set to chak

Changed 5 years ago by igloo

  • difficulty set to Unknown
  • milestone set to 6.10 branch

Changed 5 years ago by chak

  • status changed from new to closed
  • testcase set to T2219
  • resolution set to fixed

Works with the new solver.

Note: See TracTickets for help on using tickets.