+:: SemError
+ = ParseError Pos String
+ | UnifyError Pos Type Type
+ | UnifyErrorStub Type Type
+ | Error String
+:: Gamma
+:: SemOutput :== Either [SemError] (AST, Gamma)
+
+instance toString SemError
+instance toString Gamma
+
+sem :: AST -> SemOutput