0b247e4171e326a72f16efb4709643f6573d9cc3
[ghc-hetmet.git] / ghc / compiler / types / Kind.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996
3 %
4 \section[Kind]{The @Kind@ datatype}
5
6 \begin{code}
7 module Kind (
8         Kind(..),               -- Only visible to friends: TcKind
9
10         mkArrowKind,
11         mkTypeKind,
12         mkUnboxedTypeKind,
13         mkBoxedTypeKind,
14
15         isSubKindOf,
16         resultKind, argKind
17     ) where
18
19 import Ubiq{-uitous-}
20
21 import Util             ( panic )
22 \end{code}
23
24 \begin{code}
25 data Kind
26   = TypeKind            -- Any type (incl unboxed types)
27   | BoxedTypeKind       -- Any boxed type
28   | UnboxedTypeKind     -- Any unboxed type
29   | ArrowKind Kind Kind
30   deriving Eq
31
32 mkArrowKind       = ArrowKind
33 mkTypeKind        = TypeKind
34 mkUnboxedTypeKind = UnboxedTypeKind
35 mkBoxedTypeKind   = BoxedTypeKind
36
37 isSubKindOf :: Kind -> Kind -> Bool
38
39 BoxedTypeKind   `isSubKindOf` TypeKind = True
40 UnboxedTypeKind `isSubKindOf` TypeKind = True
41 kind1           `isSubKindOf` kind2    = kind1 == kind2
42
43 resultKind :: Kind -> Kind      -- Get result from arrow kind
44 resultKind (ArrowKind _ res_kind) = res_kind
45 resultKind other_kind             = panic "resultKind"
46
47 argKind :: Kind -> Kind         -- Get argument from arrow kind
48 argKind (ArrowKind arg_kind _) = arg_kind
49 argKind other_kind             = panic "argKind"
50 \end{code}