packages feed

ghc-exactprint-1.14.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 _ = ()