1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Type (tipe) where
6import qualified AST.Type as T
7import qualified AST.Variable as Var
8import qualified Canonicalize.Environment as Env
9import qualified Canonicalize.Variable as Canonicalize
10import Canonicalize.Variable (Result)
11import qualified Reporting.Annotation as A
12import qualified Reporting.Error.Canonicalize as Error
13import qualified Reporting.Region as R
14import qualified Reporting.Result as Result
21tipe :: Env.Env -> T.Raw -> Result T.Canonical
22tipe env annType@(A.A _ typ) =
27 goField (A.A _ name, t) =
35 canonicalizeApp env annType []
38 canonicalizeApp env t ts
41 T.Lambda <$> go a <*> go b
43 T.RRecord fields ext ->
44 T.Record <$> traverse goField fields <*> traverse go ext
47canonicalizeApp :: Env.Env -> T.Raw -> [T.Raw] -> Result T.Canonical
48canonicalizeApp env annFunc@(A.A region func) args =
50 T.RType (Var.Raw rawName) ->
51 canonicalizeWithTvar =<< Canonicalize.tvar region env rawName
56 <*> traverse (tipe env) args
59 canonicalizeWithTvar tvar =
62 canonicalizeAlias region env alias args
67 Result.ok (T.Type name)
70 T.App (T.Type name) <$> traverse (tipe env) args
76 -> (Var.Canonical, [Text], T.Canonical)
79canonicalizeAlias region env (name, tvars, dealiasedTipe) types =
87 toAlias canonicalTypes =
88 T.Aliased name (zip tvars canonicalTypes) (T.Holey dealiasedTipe)
90 if typesLen /= tvarsLen then
91 Result.throw region (Error.alias name tvarsLen typesLen)
94 toAlias <$> traverse (tipe env) types
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list