{-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE StarIsType #-} {-# LANGUAGE UnicodeSyntax #-} {-# OPTIONS -Wno-star-is-type #-} import Data.Typeable import Data.Kind import GHC.Exts -- Test that Typeable works for various wired-in types. -- See, for instance, #11120. rep :: forall a. Typeable a => TypeRep rep = typeRep (Proxy :: Proxy a) main :: IO () main = do -- the basics print $ rep @String print $ rep @Char print $ rep @Int print $ rep @Word print $ rep @Double print $ rep @(IO ()) print $ rep @IO print $ rep @"hi" print $ rep @(Char, Int, String) print $ rep @Bool print $ rep @Ordering print $ rep @(Int -> Int) print $ rep @((Eq Int, Eq String) :: Constraint) -- Unboxed things (#12049) print $ rep @Int# print $ rep @(##) print $ rep @(# Int#, Int #) -- Various instantiations of a kind-polymorphic type print $ rep @(Proxy (Eq Int)) print $ rep @(Proxy (Int, Int)) print $ rep @(Proxy "hello world") print $ rep @(Proxy 1) print $ rep @(Proxy [1,2,3]) print $ rep @(Proxy 'EQ) print $ rep @(Proxy TYPE) print $ rep @(Proxy (TYPE 'LiftedRep)) print $ rep @(Proxy *) print $ rep @(Proxy ★) print $ rep @(Proxy 'LiftedRep) -- Something lifted and primitive print $ rep @RealWorld -- #12132