blob: da849286aaf08fada0db67b3f13f16d5448a7f20 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnliftedDatatypes #-}
import GHC.Exts
type D1 :: TYPE (BoxedRep Unlifted)
data D1 = MkD1 !Int
showD1 :: D1 -> String
showD1 (MkD1 i) = "MkD1 " ++ show i
type D2 :: TYPE (BoxedRep Lifted)
data D2 = MkD2 !Int deriving stock Show
risky :: forall {r} (a :: TYPE (BoxedRep Unlifted)) (b :: TYPE r). a -> b
risky = unsafeCoerce#
{-# NOINLINE risky #-}
main :: IO ()
main = do
putStrLn (showD1 (unsafeCoerce# (MkD1 11))) -- foo11
print (unsafeCoerce# (MkD1 12) :: D2) -- foo12
putStrLn (showD1 (risky (MkD1 11))) -- bar11
print (risky (MkD1 12) :: D2) -- bar12
|