Commit c30744cc authored by eir@cis.upenn.edu's avatar eir@cis.upenn.edu

Updates to support closed type families.

parent a26bf928
......@@ -17,8 +17,6 @@ instance C Int where
instance C () where
type D () () = Bool
type family E a
type instance where
type family E a where
E () = Bool
E Int = String
\ No newline at end of file
type family A a b :: * -- Defined at T4175.hs:4:13
type instance A (Maybe a) a -- Defined at T4175.hs:6:15
type instance A Int Int -- Defined at T4175.hs:5:15
data family B a -- Defined at T4175.hs:8:13
data instance B () -- Defined at T4175.hs:9:15
class C a where
type family D a b :: *
-- Defined at T4175.hs:12:10
type D () () -- Defined at T4175.hs:18:10
type D Int () -- Defined at T4175.hs:15:10
type family E a :: * -- Defined at T4175.hs:20:13
type instance where
E () -- Defined at T4175.hs:23:5
E Int -- Defined at T4175.hs:24:5
data () = () -- Defined in ‛GHC.Tuple’
instance C () -- Defined at T4175.hs:17:10
instance Bounded () -- Defined in ‛GHC.Enum’
instance Enum () -- Defined in ‛GHC.Enum’
instance Eq () -- Defined in ‛GHC.Classes’
instance Ord () -- Defined in ‛GHC.Classes’
instance Read () -- Defined in ‛GHC.Read’
instance Show () -- Defined in ‛GHC.Show’
type instance where
E () -- Defined at T4175.hs:23:5
E Int -- Defined at T4175.hs:24:5
type D () () -- Defined at T4175.hs:18:10
type D Int () -- Defined at T4175.hs:15:10
data instance B () -- Defined at T4175.hs:9:15
data Maybe a = Nothing | Just a -- Defined in ‛Data.Maybe’
instance Eq a => Eq (Maybe a) -- Defined in ‛Data.Maybe’
instance Monad Maybe -- Defined in ‛Data.Maybe’
instance Functor Maybe -- Defined in ‛Data.Maybe’
instance Ord a => Ord (Maybe a) -- Defined in ‛Data.Maybe’
instance Read a => Read (Maybe a) -- Defined in ‛GHC.Read’
instance Show a => Show (Maybe a) -- Defined in ‛GHC.Show’
type instance A (Maybe a) a -- Defined at T4175.hs:6:15
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‛GHC.Types’
instance C Int -- Defined at T4175.hs:14:10
instance Bounded Int -- Defined in ‛GHC.Enum’
instance Enum Int -- Defined in ‛GHC.Enum’
instance Eq Int -- Defined in ‛GHC.Classes’
instance Integral Int -- Defined in ‛GHC.Real’
instance Num Int -- Defined in ‛GHC.Num’
instance Ord Int -- Defined in ‛GHC.Classes’
instance Read Int -- Defined in ‛GHC.Read’
instance Real Int -- Defined in ‛GHC.Real’
instance Show Int -- Defined in ‛GHC.Show’
type instance where
E () -- Defined at T4175.hs:23:5
E Int -- Defined at T4175.hs:24:5
type D Int () -- Defined at T4175.hs:15:10
type instance A Int Int -- Defined at T4175.hs:5:15
type family A a b :: * -- Defined at T4175.hs:4:13
type instance A (Maybe a) a -- Defined at T4175.hs:6:1
type instance A Int Int -- Defined at T4175.hs:5:1
data family B a -- Defined at T4175.hs:8:13
data instance B () -- Defined at T4175.hs:9:15
class C a where
type family D a b :: *
-- Defined at T4175.hs:12:10
type D () () -- Defined at T4175.hs:18:5
type D Int () -- Defined at T4175.hs:15:5
type family E a :: * where
E () = Bool
E Int = String
-- Defined at T4175.hs:20:13
data () = () -- Defined in ‛GHC.Tuple’
instance C () -- Defined at T4175.hs:17:10
instance Bounded () -- Defined in ‛GHC.Enum’
instance Enum () -- Defined in ‛GHC.Enum’
instance Eq () -- Defined in ‛GHC.Classes’
instance Ord () -- Defined in ‛GHC.Classes’
instance Read () -- Defined in ‛GHC.Read’
instance Show () -- Defined in ‛GHC.Show’
type D () () -- Defined at T4175.hs:18:5
type D Int () -- Defined at T4175.hs:15:5
data instance B () -- Defined at T4175.hs:9:15
data Maybe a = Nothing | Just a -- Defined in ‛Data.Maybe’
instance Eq a => Eq (Maybe a) -- Defined in ‛Data.Maybe’
instance Monad Maybe -- Defined in ‛Data.Maybe’
instance Functor Maybe -- Defined in ‛Data.Maybe’
instance Ord a => Ord (Maybe a) -- Defined in ‛Data.Maybe’
instance Read a => Read (Maybe a) -- Defined in ‛GHC.Read’
instance Show a => Show (Maybe a) -- Defined in ‛GHC.Show’
type instance A (Maybe a) a -- Defined at T4175.hs:6:1
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‛GHC.Types’
instance C Int -- Defined at T4175.hs:14:10
instance Bounded Int -- Defined in ‛GHC.Enum’
instance Enum Int -- Defined in ‛GHC.Enum’
instance Eq Int -- Defined in ‛GHC.Classes’
instance Integral Int -- Defined in ‛GHC.Real’
instance Num Int -- Defined in ‛GHC.Num’
instance Ord Int -- Defined in ‛GHC.Classes’
instance Read Int -- Defined in ‛GHC.Read’
instance Real Int -- Defined in ‛GHC.Real’
instance Show Int -- Defined in ‛GHC.Show’
type D Int () -- Defined at T4175.hs:15:5
type instance A Int Int -- Defined at T4175.hs:5:1
......@@ -2,8 +2,7 @@
module Overlap1 where
type family F a
type instance where
type family F a where
F Int = Int
F a = Bool
......
......@@ -2,8 +2,7 @@
module Overlap12 where
type family And (a :: Bool) (b :: Bool) :: Bool
type instance where
type family And (a :: Bool) (b :: Bool) :: Bool where
And False x = False
And True x = x
And x False = False
......@@ -12,5 +11,17 @@ type instance where
data Proxy p = P
i :: Proxy (And False x)
i = (P :: Proxy False)
\ No newline at end of file
a :: Proxy (And False x)
a = (P :: Proxy False)
b :: Proxy x -> Proxy (And True x)
b x = x
c :: Proxy (And x False)
c = (P :: Proxy False)
d :: Proxy x -> Proxy (And x True)
d x = x
e :: Proxy x -> Proxy (And x x)
e x = x
{-# LANGUAGE TypeFamilies #-}
module Overlap13 where
type family F a b where
F a a = Int
F a Int = Int
F a b = b
g :: a -> F a Int
g x = (5 :: Int)
{-# LANGUAGE TypeFamilies #-}
module Overlap14 where
type family F a b c where
F a a a = Int
F Int b c = Bool
type family G x
foo :: F Int (G Bool) Bool
foo = False
......@@ -2,8 +2,7 @@
module Overlap2 where
type family F a b
type instance where
type family F a b where
F a a = Int
F a b = Bool
......
TYPE SIGNATURES
emptyL :: forall a. ListColl a
test2 ::
forall c t t1. (Num t, Num t1, Coll c, Elem c ~ (t, t1)) => c -> c
TYPE CONSTRUCTORS
Coll :: * -> Constraint
class Coll c
RecFlag NonRecursive
type family Elem c :: *
empty :: c insert :: Elem c -> c -> c
ListColl :: * -> *
data ListColl a
No C type associated
RecFlag NonRecursive, Promotable
= L :: forall a. [a] -> ListColl a Stricts: _
FamilyInstance: none
COERCION AXIOMS
axiom Foo.TFCo:R:ElemListColl :: Elem (ListColl a) = a
INSTANCES
instance Coll (ListColl a) -- Defined at T3017.hs:12:11
FAMILY INSTANCES
type Elem (ListColl a) -- Defined at T3017.hs:13:9
Dependent modules: []
Dependent packages: [base, ghc-prim, integer-gmp]
TYPE SIGNATURES
emptyL :: forall a. ListColl a
test2 ::
forall c t t1. (Num t, Num t1, Coll c, Elem c ~ (t, t1)) => c -> c
TYPE CONSTRUCTORS
Coll :: * -> Constraint
class Coll c
RecFlag NonRecursive
type family Elem c :: *
empty :: c insert :: Elem c -> c -> c
ListColl :: * -> *
data ListColl a
No C type associated
RecFlag NonRecursive, Promotable
= L :: forall a. [a] -> ListColl a Stricts: _
FamilyInstance: none
COERCION AXIOMS
axiom Foo.TFCo:R:ElemListColl :: Elem (ListColl a) = a
INSTANCES
instance Coll (ListColl a) -- Defined at T3017.hs:12:11
FAMILY INSTANCES
type Elem (ListColl a) -- Defined at T3017.hs:13:4
Dependent modules: []
Dependent packages: [base, ghc-prim, integer-gmp]
......@@ -11,8 +11,7 @@ data SList :: [Bool] -> * where
SNil :: SList '[]
SCons :: SBool h -> SList t -> SList (h ': t)
type family (a :: k) :==: (b :: k) :: Bool
type instance where
type family (a :: k) :==: (b :: k) :: Bool where
'[] :==: '[] = True
(h1 ': t1) :==: (h2 ': t2) = True
a :==: b = False
......
......@@ -200,6 +200,8 @@ test('T7082', normal, compile, [''])
test('Overlap1', normal, compile, [''])
test('Overlap2', normal, compile, [''])
test('Overlap12', normal, compile, [''])
test('Overlap13', normal, compile, [''])
test('Overlap14', normal, compile, [''])
test('T7156', normal, compile, [''])
test('T5591a', normal, compile, [''])
test('T5591b', normal, compile, [''])
......
{-# LANGUAGE TypeFamilies #-}
module Overlap8 where
type family F a b
type instance F a Int = Int
type instance where
F Int a = Int
F a b = Bool
type instance F a a = Int
type instance F [a] a = Bool
T7560.hs:8:3:
NoGood.hs:4:15:
Conflicting family instance declarations:
F Int -- Defined at T7560.hs:8:3
F Int -- Defined at T7560.hs:12:3
F a a -- Defined at NoGood.hs:4:15
F [a] a -- Defined at NoGood.hs:5:15
......@@ -2,8 +2,7 @@
module Overlap10 where
type family F a b
type instance where
type family F a b where
F a a = Int
F a b = b
......
Overlap10.hs:11:7:
Overlap10.hs:10:7:
Couldn't match expected type ‛F a Bool’ with actual type ‛Bool’
Relevant bindings include
g :: a -> F a Bool (bound at Overlap10.hs:11:1)
x :: a (bound at Overlap10.hs:11:3)
g :: a -> F a Bool (bound at Overlap10.hs:10:1)
x :: a (bound at Overlap10.hs:10:3)
In the expression: False
In an equation for ‛g’: g x = False
......@@ -2,8 +2,7 @@
module Overlap11 where
type family F a b
type instance where
type family F a b where
F a a = Int
F a b = b
......
Overlap11.hs:11:8:
Overlap11.hs:10:8:
Couldn't match expected type ‛F a Int’ with actual type ‛Int’
Relevant bindings include
g :: a -> F a Int (bound at Overlap11.hs:11:1)
x :: a (bound at Overlap11.hs:11:3)
g :: a -> F a Int (bound at Overlap11.hs:10:1)
x :: a (bound at Overlap11.hs:10:3)
In the expression: (5 :: Int)
In an equation for ‛g’: g x = (5 :: Int)
......@@ -2,8 +2,7 @@
module Overlap3 where
type family F a b
type instance where
type family F a b where
F a a = Int
F a b = Bool
type instance F Char Char = Int
......
Overlap3.hs:7:3:
Conflicting family instance declarations:
F a a -- Defined at Overlap3.hs:7:3
F Char Char -- Defined at Overlap3.hs:9:15
Overlap3.hs:8:3:
Conflicting family instance declarations:
F a b -- Defined at Overlap3.hs:8:3
F Char Char -- Defined at Overlap3.hs:9:15
Overlap3.hs:8:1:
Illegal instance for closed family ‛F’
In the type instance declaration for ‛F’
......@@ -2,15 +2,7 @@
module Overlap4 where
type family F a b
type instance F Char Char = Int
type instance where
F a a = Int
F a b = Bool
type family F a b where
F Int Int = Bool
F Bool = Maybe
g :: F Char Double
g = False
h :: F Double Double
h = -2
Overlap4.hs:6:15:
Conflicting family instance declarations:
F Char Char -- Defined at Overlap4.hs:6:15
F a a -- Defined at Overlap4.hs:8:3
Overlap4.hs:7:3:
Number of parameters must match family declaration; expected 2
In the equations for closed type family ‛F’
In the family declaration for ‛F’
{-# LANGUAGE TypeFamilies, DataKinds, PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Overlap5 where
type family And (a :: Bool) (b :: Bool) :: Bool
type instance where
And False x = False
And True x = x
And x False = False
And x True = x
And x x = x
data Proxy p = P
g :: Proxy x -> Proxy (And x True)
g x = x
h :: Proxy x -> Proxy (And x x)
h x = x
i :: Proxy x -> Proxy (And False x)
i x = (P :: Proxy False)
\ No newline at end of file
type family G a
type family F a where
F Int = Bool
G Int = Char
F a = Int
\ No newline at end of file
Overlap5.hs:16:7:
Couldn't match type ‛x’ with ‛And x 'True’
‛x’ is a rigid type variable bound by
the type signature for
g :: Proxy Bool x -> Proxy Bool (And x 'True)
at Overlap5.hs:15:6
Expected type: Proxy Bool (And x 'True)
Actual type: Proxy Bool x
Relevant bindings include
g :: Proxy Bool x -> Proxy Bool (And x 'True)
(bound at Overlap5.hs:16:1)
x :: Proxy Bool x (bound at Overlap5.hs:16:3)
In the expression: x
In an equation for ‛g’: g x = x
Overlap5.hs:19:7:
Couldn't match type ‛x’ with ‛And x x’
‛x’ is a rigid type variable bound by
the type signature for h :: Proxy Bool x -> Proxy Bool (And x x)
at Overlap5.hs:18:6
Expected type: Proxy Bool (And x x)
Actual type: Proxy Bool x
Relevant bindings include
h :: Proxy Bool x -> Proxy Bool (And x x)
(bound at Overlap5.hs:19:1)
x :: Proxy Bool x (bound at Overlap5.hs:19:3)
In the expression: x
In an equation for ‛h’: h x = x
Overlap5.hs:8:3:
Mismatched type names in closed type family declaration.
First name was F; this one is G
In the family declaration for ‛F’
......@@ -2,8 +2,7 @@
module Overlap6 where
type family And (a :: Bool) (b :: Bool) :: Bool
type instance where
type family And (a :: Bool) (b :: Bool) :: Bool where
And False x = False
And True x = False -- this is wrong!
And x False = False
......
Overlap6.hs:16:7:
Overlap6.hs:15:7:
Couldn't match type ‛x’ with ‛And x 'True’
‛x’ is a rigid type variable bound by
the type signature for
g :: Proxy Bool x -> Proxy Bool (And x 'True)
at Overlap6.hs:15:6
at Overlap6.hs:14:6
Expected type: Proxy Bool (And x 'True)
Actual type: Proxy Bool x
Relevant bindings include
g :: Proxy Bool x -> Proxy Bool (And x 'True)
(bound at Overlap6.hs:16:1)
x :: Proxy Bool x (bound at Overlap6.hs:16:3)
(bound at Overlap6.hs:15:1)
x :: Proxy Bool x (bound at Overlap6.hs:15:3)
In the expression: x
In an equation for ‛g’: g x = x
......@@ -2,8 +2,7 @@
module Overlap7 where
type family F a b
type instance where
type family F a b where
F Int a = Int
F a b = Bool
type instance F a Int = Int
......
Overlap7.hs:7:3:
Conflicting family instance declarations:
F Int a -- Defined at Overlap7.hs:7:3
F a Int -- Defined at Overlap7.hs:9:15
Overlap7.hs:8:3:
Conflicting family instance declarations:
F a b -- Defined at Overlap7.hs:8:3
F a Int -- Defined at Overlap7.hs:9:15
Overlap7.hs:8:1:
Illegal instance for closed family ‛F’
In the type instance declaration for ‛F’
Overlap8.hs:6:15:
Conflicting family instance declarations:
F a Int -- Defined at Overlap8.hs:6:15
F Int a -- Defined at Overlap8.hs:8:3
......@@ -2,8 +2,7 @@
module Overlap9 where
type family F a
type instance where
type family F a where
F Int = Bool
F a = Int
......
Overlap9.hs:11:7:
Overlap9.hs:10:7:
Could not deduce (F a ~ Int)
from the context (Show a)
bound by the type signature for g :: Show a => a -> F a
at Overlap9.hs:10:6-23
at Overlap9.hs:9:6-23
Relevant bindings include
g :: a -> F a (bound at Overlap9.hs:11:1)
x :: a (bound at Overlap9.hs:11:3)
g :: a -> F a (bound at Overlap9.hs:10:1)
x :: a (bound at Overlap9.hs:10:3)
In the expression: length (show x)
In an equation for ‛g’: g x = length (show x)
SimpleFail1a.hs:4:1:
Number of parameters must match family declaration; expected 2
Couldn't match kind ‛* -> *’ against ‛*’
In the data instance declaration for ‛T1’
SimpleFail1b.hs:4:1:
Number of parameters must match family declaration; expected 2
Number of parameters must match family declaration; expected no more than 2
In the data instance declaration for ‛T1’
T5515.hs:9:8:
T5515.hs:9:3:
The RHS of an associated type declaration mentions type variable ‛a’
All such variables must be bound on the LHS
T5515.hs:15:8:
T5515.hs:15:3:
The RHS of an associated type declaration mentions type variable ‛a’
All such variables must be bound on the LHS
{-# LANGUAGE TypeFamilies #-}
module T7560 where
type family F a
type instance where
F Int = Int
F Bool = Bool
type instance where
F Int = Char
F Double = Double
\ No newline at end of file
......@@ -50,8 +50,7 @@ buryUnder (ps `Snoc` p) post acc = (ps `buryUnder` post) acc `Snoc` (p `under` p
type key `KeyNotIn` inv = Intersect (More Empty key) inv ~ Empty
type (lhs `UnderDisjoint` post) rhs = Intersect ((lhs `BuriedUnder` post) Empty) rhs ~ Empty
type family Intersect (l :: Inventory a) (r :: Inventory a) :: Inventory a
type instance where
type family Intersect (l :: Inventory a) (r :: Inventory a) :: Inventory a where
Intersect Empty r = Empty
Intersect l Empty = Empty
Intersect (More ls l) r = InterAppend (Intersect ls r) r l
......@@ -59,8 +58,7 @@ type instance where
type family InterAppend (l :: Inventory a)
(r :: Inventory a)
(one :: a)
:: Inventory a
type instance where
:: Inventory a where
InterAppend acc Empty one = acc
InterAppend acc (More rs one) one = More acc one
InterAppend acc (More rs r) one = InterAppend acc rs one
......@@ -68,8 +66,7 @@ type instance where
type family BuriedUnder (sub :: Inventory [KeySegment])
(post :: [KeySegment])
(inv :: Inventory [KeySegment])
:: Inventory [KeySegment]
type instance where
:: Inventory [KeySegment] where
BuriedUnder Empty post inv = inv
BuriedUnder (More ps p) post inv = More ((ps `BuriedUnder` post) inv) (p `Under` post)
......
T7786.hs:89:22:
T7786.hs:86:22:
Couldn't match type ‛xxx’ with ‛'Empty [KeySegment]’
Inaccessible code in
a pattern with constructor
......
......@@ -82,7 +82,6 @@ test('Overlap4', normal, compile_fail, [''])
test('Overlap5', normal, compile_fail, [''])
test('Overlap6', normal, compile_fail, [''])
test('Overlap7', normal, compile_fail, [''])
test('Overlap8', normal, compile_fail, [''])
test('Overlap9', normal, compile_fail, [''])
test('Overlap10', normal, compile_fail, [''])
test('Overlap11', normal, compile_fail, [''])
......@@ -94,8 +93,10 @@ test('T7354a',
['$MAKE -s --no-print-directory T7354a'])
test('T7536', normal, compile_fail, [''])
test('T7560', normal, compile_fail, [''])
test('T7729', normal, compile_fail, [''])
test('T7729a', normal, compile_fail, [''])
test('T7786', normal, compile_fail, [''])
test('NoGood', normal, compile_fail, [''])
test('T7967', normal, compile_fail, [''])
{-# LANGUAGE TemplateHaskell, TypeFamilies, PolyKinds, DataKinds #-}
module ClosedFam1 where
import Language.Haskell.TH
$(do { decl <- [d| type family Foo a (b :: k) where
Foo Int Bool = Int
Foo a Maybe = Bool
Foo b (x :: Bool) = Char |]
; reportWarning (pprint decl)
; return [] })
ClosedFam1.hs:7:3: Warning:
type family Foo_0 a_1 (b_2 :: k_3) where
Foo_0 GHC.Types.Int GHC.Types.Bool = GHC.Types.Int
Foo_0 a_4 Data.Maybe.Maybe = GHC.Types.Bool
Foo_0 b_5 (x_6 :: GHC.Types.Bool) = GHC.Types.Char
{-# LANGUAGE TemplateHaskell, TypeFamilies, PolyKinds #-}
module ClosedFam2 where
import Language.Haskell.TH
$( return [ ClosedTypeFamilyD (mkName "Equals")
[ KindedTV (mkName "a") (VarT (mkName "k"))
, KindedTV (mkName "b") (VarT (mkName "k")) ]
Nothing
[ TySynEqn [ (VarT (mkName "a"))
, (VarT (mkName "a")) ]
(ConT (mkName "Int"))
, TySynEqn [ (VarT (mkName "a"))
, (VarT (mkName "b")) ]
(ConT (mkName "Bool")) ] ])
a :: Equals b b
a = (5 :: Int)
b :: Equals Int Bool
b = False
......@@ -11,4 +11,4 @@ class C α where
bang DecsQ
bang = return [InstanceD [] (AppT (ConT ''C) (ConT ''Int))
[TySynInstD ''AT [TySynEqn [ConT ''Int] (ConT ''Int)]]]
[TySynInstD ''AT (TySynEqn [ConT ''Int] (ConT ''Int))]]
......@@ -2,9 +2,7 @@
module TH_TyInstWhere1 where
type family F (a :: k) (b :: k) :: Bool
$([d| type instance where
$([d| type family F (a :: k) (b :: k) :: Bool where
F a a = True
F a b = False |])
......
TH_TyInstWhere1.hs:1:1: Splicing declarations
[d| type instance where
[d| type family F (a :: k) (b :: k) :: Bool where
F a a = True
F a b = False |]
======>