84 | | ~~== Kinds ==~~ |

85 | | |

86 | | ~~Kinds are represented as types:~~ |

87 | | ~~{{{~~ |

88 | | ~~type Kind = Type~~ |

89 | | ~~}}}~~ |

90 | | ~~Basic kinds are now~~ |

91 | | ~~represented using type constructors, e.g. the kind `*` is represented as~~ |

92 | | ~~{{{~~ |

93 | | ~~liftedTypeKind :: Kind~~ |

94 | | ~~liftedTypeKind = TyConApp liftedTypeKindTyCon []~~ |

95 | | ~~}}}~~ |

96 | | ~~where `liftedTypeKindTyCon` is a built-in `PrimTyCon`. The arrow type~~ |

97 | | ~~constructor is used as the arrow kind constructor, e.g. the kind `* -> *` ~~ |

98 | | ~~is represented internally as~~ |

99 | | ~~{{{~~ |

100 | | ~~FunTy liftedTypeKind liftedTypeKind~~ |

101 | | ~~}}}~~ |

102 | | ~~It's easy to extract the kind of a type, or the sort of a kind:~~ |

103 | | ~~{{{~~ |

104 | | ~~typeKind :: Type -> Kind~~ |

105 | | ~~}}}~~ |

106 | | ~~The "sort" of a kind is always one of the~~ |

107 | | ~~sorts: `TY` (for kinds that classify normal types) or `CO` (for kinds that~~ |

108 | | ~~classify coercion evidence). The coercion kind, `T1 :=: T2`, is~~ |

109 | | ~~represented by `PredTy (EqPred T1 T2)`.~~ |

110 | | |

111 | | ~~=== Kind subtyping ===~~ |

112 | | |

113 | | ~~[[Image(https://docs.google.com/drawings/pub?id=1M5yBP8iAWTgqdI3oG1UNnYihVlipnvvk2vLInAFxtNM&w=359&h=229)]]~~ |

114 | | |

115 | | ~~(You can edit this picture [https://docs.google.com/drawings/d/1M5yBP8iAWTgqdI3oG1UNnYihVlipnvvk2vLInAFxtNM/edit?hl=en_GB here].)~~ |

116 | | |

117 | | ~~`*` is the kind of boxed values. Things like `Int` and `Maybe Float` have kind `*`.~~ |

118 | | |

119 | | ~~`#` is the kind of unboxed values. Things like `Int#` have kind `#`.~~ |

120 | | |

121 | | ~~`(#)` is the kind of unboxed tuples. Things like `(# Int, Int #)` have kind `(#)`.~~ |

122 | | |

123 | | ~~`ArgKind` is the kind of things that can appear as arguments to functions.~~ |

124 | | |

125 | | ~~`OpenKind` is the kind of things that can appear as results of functions.~~ |

126 | | |