1-----------------------------------------------------------------------------
3-- Module : PureScript.TypeChecker
4-- Copyright : (c) Phil Freeman 2013
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
13-----------------------------------------------------------------------------
15{-# LANGUAGE GeneralizedNewtypeDeriving, FlexibleInstances #-}
17module PureScript.TypeChecker (
18 module PureScript.TypeChecker.Monad,
19 module PureScript.TypeChecker.Kinds,
20 module PureScript.TypeChecker.Types,
25import PureScript.TypeChecker.Monad
26import PureScript.TypeChecker.Kinds
27import PureScript.TypeChecker.Types
33import PureScript.Values
34import PureScript.Types
35import PureScript.Kinds
36import PureScript.Declarations
38import Control.Monad.State
39import Control.Monad.Error
41import qualified Data.Map as M
43typeCheck :: Declaration -> Check ()
44typeCheck (DataDeclaration dcs@(DataConstructors
45 { typeConstructorName = name
46 , typeArguments = args
47 , dataConstructors = ctors
48 })) = rethrow (("Error in type constructor " ++ name ++ ": ") ++) $ do
50 guardWith (name ++ " is already defined") $ not $ M.member name (types env)
51 ctorKind <- kindsOf name args (catMaybes $ map snd ctors)
52 putEnv $ env { types = M.insert name ctorKind (types env) }
53 flip mapM_ ctors $ \(dctor, maybeTy) ->
54 rethrow (("Error in data constructor " ++ name ++ ": ") ++) $ do
56 guardWith (dctor ++ " is already defined") $ not $ flip M.member (names env') dctor
57 let retTy = foldl TypeApp (TypeConstructor name) (map TypeVar args)
58 let dctorTy = maybe retTy (\ty -> Function [ty] retTy) maybeTy
59 putEnv $ env' { names = M.insert dctor dctorTy (names env') }
60typeCheck (ValueDeclaration name val) = rethrow (("Error in declaration " ++ name ++ ": ") ++) $ do
62 case M.lookup name (names env) of
63 Just ty -> throwError $ name ++ " is already defined"
66 putEnv (env { names = M.insert name ty (names env) })
68typeCheckAll :: [Declaration] -> Check ()
69typeCheckAll = mapM_ typeCheck
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