ghc-exactprint-1.11.0.0: tests/examples/ghc912/T23501a.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds, NoListTuplePuns #-}
module T23501a where
import Prelude.Experimental (List, Unit)
import Data.Kind (Type, Constraint)
----------------------------
-- Class declarations --
----------------------------
class C1 (_ :: k) _ -- no SAKS
where f1 :: k -> Unit
f1' :: C1 @k a b => k -> Unit
f1' @_ @a @b = f1 @_ @a @b
type C2 :: k1 -> k2 -> Constraint
class C2 (_ :: k) _ where
f2 :: k -> Unit
f2' :: C2 @k1 @k2 a b => k1 -> Unit
f2' @_ @_ @a @b = f2 @_ @_ @a @b
type C3 :: k1 -> k2 -> Constraint
class C3 @k @_ _ _ where
f3 :: k -> Unit
f3' :: C3 @k1 @k2 a b => k1 -> Unit
f3' @_ @_ @a @b = f3 @_ @_ @a @b
---------------------------
-- Data declarations --
---------------------------
data D1 k (_ :: k) _ -- no SAKS
where MkD1 :: k -> D1 k a b
mkD1 :: k -> D1 k a b
mkD1 = MkD1
type D2 :: forall (k1 :: Type) -> k1 -> k2 -> Type
data D2 k (_ :: k) _ where
MkD2 :: k -> D2 k a b
mkD2 :: k -> D2 k a b
mkD2 = MkD2
type D3 :: k1 -> k2 -> Type
data D3 @k @_ _ _ = MkD3 k
data MProxy (_ :: Type) = MPrx
data CProxy (_ :: k -> Constraint) = CPrx
type Rec :: (k -> Type) -> List k -> Type
data Rec _ _ where
RNil :: Rec f []
(:&) :: f x -> Rec f xs -> Rec f (x:xs)
------------------
-- Newtypes --
------------------
newtype N1 k (_ :: k) _ -- no SAKS
= MkN1 k
mkN1 :: k -> N1 k a b
mkN1 = MkN1
type N2 :: forall (k1 :: Type) -> k1 -> k2 -> Type
newtype N2 k (_ :: k) _ = MkN2 k
mkN2 :: k -> N2 k a b
mkN2 = MkN2
----------------------------
-- Open type families --
----------------------------
type family OTF1 (_ :: Type -> Type) _ -- no SAKS
type instance OTF1 f x = f x
otf1 :: OTF1 Maybe Int -> Int
otf1 Nothing = 0
otf1 (Just x) = x
type OTF2 :: (Type -> Type) -> Type -> Type
type family OTF2 (_ :: Type -> Type) _
type instance OTF2 f x = f x
otf2 :: OTF2 Maybe Int -> Int
otf2 Nothing = 0
otf2 (Just x) = x
------------------------------
-- Closed type families --
------------------------------
type family CTF1 (_ :: Type -> Type) _ -- no SAKS
where CTF1 f x = f x
ctf1 :: CTF1 Maybe Int -> Int
ctf1 Nothing = 0
ctf1 (Just x) = x
type CTF2 :: (Type -> Type) -> Type -> Type
type family CTF2 (_ :: Type -> Type) _ where
CTF2 f x = f x
ctf2 :: CTF2 Maybe Int -> Int
ctf2 Nothing = 0
ctf2 (Just x) = x
type CTF3 :: k1 -> k2 -> Type
type family CTF3 @_ @k _ _
where CTF3 @_ @k _ _ = k
ctf3 :: CTF3 a True -> Bool
ctf3 = id
-----------------------
-- Type synonyms --
-----------------------
type T1 (_ :: Type -> Type) _ = () -- no SAKS
type T2 :: (Type -> Type) -> k -> Type
type T2 (_ :: Type -> Type) _ = Unit
type T3 :: k1 -> k2 -> Type
type T3 @_ @k _ _ = k
type FConst _ = ()