blob: a79d503e7e943a4ea19904d7362e1e03f72f62a6 (
plain) (
tree)
|
|
{-# LANGUAGE TypeFamilies, UndecidableInstances, PolyKinds, TypeOperators, DataKinds, MultiParamTypeClasses, GADTs #-}
-- | Doc for: module TypeFamilies
module TypeFamilies where
import qualified TypeFamilies2 as TF
-- | Doc for: data X
data X
= X -- ^ Doc for: X
| XX -- ^ Doc for: XX
| XXX -- ^ Doc for: XXX
-- | Doc for: data Y
data Y
-- | Doc for: data Z
data Z = ZA | ZB
-- | Doc for: class Test a
class Test a
-- | Doc for: instance Test X
instance Test X
-- | Doc for: instance Test Y
instance Test Y
-- | Doc for: type family Foo a
type family Foo a :: k
-- | Doc for: type instance Foo X = Y
type instance Foo X = Y
-- | Doc for: type instance Foo Y = X
type instance Foo Y = X
-- | Doc for: data family Bat a
data family Bat (a :: k) :: *
-- | Doc for: data instance Bat X
data instance Bat X
= BatX X -- ^ Doc for: BatX X
| BatXX { aaa :: X , bbb :: Y } -- ^ Doc for: BatXX { ... }
-- | Doc for: data instance Bat Y
data instance Bat Y = BatY Y -- ^ Doc for: BatY Y
-- | Doc for: data instance Bat Z
data instance Bat (z :: Z) where
BatZ1 :: Z -> Bat ZA
BatZ2 :: { batx :: X, baty :: Y } -> Bat ZB
-- | Doc for: class Assoc a
class Assoc a where
-- | Doc for: data AssocD a
data AssocD a :: *
-- | Doc for: type AssocT a
type AssocT a :: *
-- | Doc for: instance Assoc X
instance Assoc X where
-- | Doc for: data AssocD X = AssocX
data AssocD X = AssocX -- ^ Doc for: AssocX
-- | Doc for: type AssocT X = Foo X
type AssocT X = Foo X
-- | Doc for: instance Assoc Y
instance Assoc Y where
-- | Doc for: data AssocD Y = AssocY
data AssocD Y = AssocY -- ^ Doc for: AssocY
-- | Doc for: type AssocT Y = Bat Y
type AssocT Y = Bat Y
-- | Doc for: type family Bar b
type family Bar b where
Bar X = X
Bar y = Y
type family (<>) (a :: k) (b :: k) :: k
type instance X <> a = X
type instance Y <> a = a
type instance XXX <> XX = 'X
class (><) (a :: k) (b :: k)
instance XX >< XXX
-- | External instance
type instance TF.Foo X = Y
data instance TF.Bar Y
|