blob: 42a04ae94e3f3361dcd378f32f2b66451ce24032 (
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
{-# LANGUAGE UnboxedSums, MagicHash #-}
module Main where
import GHC.Prim
import GHC.Types
import System.Mem (performMajorGC)
type Either1 a b = (# a | b #)
showEither1 :: (Show a, Show b) => Either1 a b -> String
showEither1 (# left | #) = "Left " ++ show left
showEither1 (# | right #) = "Right " ++ show right
showEither2 :: (# Int# | Float# #) -> String
showEither2 (# i | #) = "Left " ++ show (I# i)
showEither2 (# | f #) = "Right " ++ show (F# f)
showEither3 :: Show a => (# a | Int# #) -> String
showEither3 (# a | #) = "Left " ++ show a
showEither3 (# | i #) = "Right " ++ show (I# i)
type T = (# Int | Bool | String | Char | Either Int Bool | Int# | Float# #)
showEither4 :: T -> String
showEither4 (# i | | | | | | #) = "Alt0: " ++ show i
showEither4 (# | b | | | | | #) = "Alt1: " ++ show b
showEither4 (# | | s | | | | #) = "Alt2: " ++ show s
showEither4 (# | | | c | | | #) = "Alt3: " ++ show c
showEither4 (# | | | | e | | #) = "Alt4: " ++ show e
showEither4 (# | | | | | i | #) = "Alt5: " ++ show (I# i)
showEither4 (# | | | | | | f #) = "Alt6: " ++ show (F# f)
main :: IO ()
main = do
putStrLn (showEither1 e1_1)
putStrLn (showEither1 e1_2)
putStrLn (showEither2 e2_1)
putStrLn (showEither2 e2_2)
putStrLn (showEither3 e3_1)
putStrLn (showEither3 e3_2)
putStrLn (showEither4 e4_1)
putStrLn (showEither4 e4_2)
putStrLn (showEither4 e4_3)
putStrLn (showEither4 e4_4)
putStrLn (showEither4 e4_5)
putStrLn (showEither4 e4_6)
putStrLn (showEither4 e4_7)
-- make sure we don't put pointers to non-pointer slots
performMajorGC
-- make sure pointers in unboxed sums are really roots
putStrLn (showEither1 e1_1)
where
-- boxed types only
e1_1, e1_2 :: Either1 String Int
e1_1 = (# "error" | #)
e1_2 = (# | 10 #)
-- prim types only
e2_1, e2_2 :: (# Int# | Float# #)
e2_1 = (# 10# | #)
e2_2 = (# | 1.2# #)
-- a mix of prim and boxed types
e3_1, e3_2 :: (# String | Int# #)
e3_1 = (# "OK" | #)
e3_2 = (# | 123# #)
-- big arity
e4_1, e4_2, e4_3, e4_4, e4_5, e4_6, e4_7 :: T
e4_1 = (# 10 | | | | | | #)
e4_2 = (# | False | | | | | #)
e4_3 = (# | | "ok" | | | | #)
e4_4 = (# | | | 'a' | | | #)
e4_5 = (# | | | | Right True | | #)
e4_6 = (# | | | | | 123# | #)
e4_7 = (# | | | | | | 54.3# #)
|