@@ -39,15 +39,15 @@ import Language.PureScript.TypeClassDictionaries
3939import Language.PureScript.Environment
4040import Language.PureScript.Errors
4141
42−addDataType ::
43− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
44− ModuleName ->
45− DataDeclType ->
46− ProperName ->
47− [(String, Maybe Kind)] ->
48− [(ProperName, [Type])] ->
49− Kind ->
50− m ()
42+addDataType
43+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
44+ => ModuleName
45+ -> DataDeclType
46+ -> ProperName 'TypeName
47+ -> [(String, Maybe Kind)]
48+ -> [(ProperName 'ConstructorName, [Type])]
49+ -> Kind
50+ -> m ()
5151addDataType moduleName dtype name args dctors ctorKind = do
5252 env <- getEnv
5353 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (ctorKind, DataType args dctors) (types env) }
@@ -55,15 +55,15 @@ addDataType moduleName dtype name args dctors ctorKind = do
5555 warnAndRethrow (addHint (ErrorInDataConstructor dctor)) $
5656 addDataConstructor moduleName dtype name (map fst args) dctor tys
5757
58−addDataConstructor ::
59− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
60− ModuleName ->
61− DataDeclType ->
62− ProperName ->
63− [String] ->
64− ProperName ->
65− [Type] ->
66− m ()
58+addDataConstructor
59+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
60+ => ModuleName
61+ -> DataDeclType
62+ -> ProperName 'TypeName
63+ -> [String]
64+ -> ProperName 'ConstructorName
65+ -> [Type]
66+ -> m ()
6767addDataConstructor moduleName dtype name args dctor tys = do
6868 env <- getEnv
6969 traverse_ checkTypeSynonyms tys
@@ -73,50 +73,50 @@ addDataConstructor moduleName dtype name args dctor tys = do
7373 let fields = [Ident ("value" ++ show n) | n <- [0..(length tys - 1)]]
7474 putEnv $ env { dataConstructors = M.insert (Qualified (Just moduleName) dctor) (dtype, name, polyType, fields) (dataConstructors env) }
7575
76−addTypeSynonym ::
77− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
78− ModuleName ->
79− ProperName ->
80− [(String, Maybe Kind)] ->
81− Type ->
82− Kind ->
83− m ()
76+addTypeSynonym
77+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
78+ => ModuleName
79+ -> ProperName 'TypeName
80+ -> [(String, Maybe Kind)]
81+ -> Type
82+ -> Kind
83+ -> m ()
8484addTypeSynonym moduleName name args ty kind = do
8585 env <- getEnv
8686 checkTypeSynonyms ty
8787 putEnv $ env { types = M.insert (Qualified (Just moduleName) name) (kind, TypeSynonym) (types env)
8888 , typeSynonyms = M.insert (Qualified (Just moduleName) name) (args, ty) (typeSynonyms env) }
8989
90−valueIsNotDefined ::
91− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
92− ModuleName ->
93− Ident ->
94− m ()
90+valueIsNotDefined
91+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
92+ => ModuleName
93+ -> Ident
94+ -> m ()
9595valueIsNotDefined moduleName name = do
9696 env <- getEnv
9797 case M.lookup (moduleName, name) (names env) of
9898 Just _ -> throwError . errorMessage $ RedefinedIdent name
9999 Nothing -> return ()
100100
101−addValue ::
102− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
103− ModuleName ->
104− Ident ->
105− Type ->
106− NameKind ->
107− m ()
101+addValue
102+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
103+ => ModuleName
104+ -> Ident
105+ -> Type
106+ -> NameKind
107+ -> m ()
108108addValue moduleName name ty nameKind = do
109109 env <- getEnv
110110 putEnv (env { names = M.insert (moduleName, name) (ty, nameKind, Defined) (names env) })
111111
112−addTypeClass ::
113− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
114− ModuleName ->
115− ProperName ->
116− [(String, Maybe Kind)] ->
117− [Constraint] ->
118− [Declaration] ->
119− m ()
112+addTypeClass
113+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
114+ => ModuleName
115+ -> ProperName 'ClassName
116+ -> [(String, Maybe Kind)]
117+ -> [Constraint]
118+ -> [Declaration]
119+ -> m ()
120120addTypeClass moduleName pn args implies ds =
121121 let members = map toPair ds in
122122 modify $ \st -> st { checkEnv = (checkEnv st) { typeClasses = M.insert (Qualified (Just moduleName) pn) (args, members, implies) (typeClasses . checkEnv $ st) } }
@@ -125,30 +125,30 @@ addTypeClass moduleName pn args implies ds =
125125 toPair (PositionedDeclaration _ _ d) = toPair d
126126 toPair _ = internalError "Invalid declaration in TypeClassDeclaration"
127127
128−addTypeClassDictionaries ::
129− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
130− Maybe ModuleName ->
131− M.Map (Qualified ProperName) (M.Map (Qualified Ident) TypeClassDictionaryInScope) ->
132− m ()
128+addTypeClassDictionaries
129+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
130+ => Maybe ModuleName
131+ -> M.Map (Qualified (ProperName 'ClassName)) (M.Map (Qualified Ident) TypeClassDictionaryInScope)
132+ -> m ()
133133addTypeClassDictionaries mn entries =
134134 modify $ \st -> st { checkEnv = (checkEnv st) { typeClassDictionaries = insertState st } }
135135 where insertState st = M.insertWith (M.unionWith M.union) mn entries (typeClassDictionaries . checkEnv $ st)
136136
137−checkDuplicateTypeArguments ::
138− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
139− [String] ->
140− m ()
137+checkDuplicateTypeArguments
138+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
139+ => [String]
140+ -> m ()
141141checkDuplicateTypeArguments args = for_ firstDup $ \dup ->
142142 throwError . errorMessage $ DuplicateTypeArgument dup
143143 where
144144 firstDup :: Maybe String
145145 firstDup = listToMaybe $ args \\ nub args
146146
147−checkTypeClassInstance ::
148− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
149− ModuleName ->
150− Type ->
151− m ()
147+checkTypeClassInstance
148+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
149+ => ModuleName
150+ -> Type
151+ -> m ()
152152checkTypeClassInstance _ (TypeVar _) = return ()
153153checkTypeClassInstance _ (TypeConstructor ctor) = do
154154 env <- getEnv
@@ -160,10 +160,10 @@ checkTypeClassInstance _ ty = throwError . errorMessage $ InvalidInstanceHead ty
160160-- |
161161-- Check that type synonyms are fully-applied in a type
162162--
163−checkTypeSynonyms ::
164− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
165− Type ->
166− m ()
163+checkTypeSynonyms
164+ :: (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
165+ => Type
166+ -> m ()
167167checkTypeSynonyms = void . replaceAllTypeSynonyms
168168
169169-- |
@@ -179,12 +179,13 @@ checkTypeSynonyms = void . replaceAllTypeSynonyms
179179--
180180-- * Process module imports
181181--
182−typeCheckAll :: forall m.
183− (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
184− ModuleName ->
185− [DeclarationRef] ->
186− [Declaration] ->
187− m [Declaration]
182+typeCheckAll
183+ :: forall m
184+ . (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
185+ => ModuleName
186+ -> [DeclarationRef]
187+ -> [Declaration]
188+ -> m [Declaration]
188189typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
189190 where
190191 go :: Declaration -> m Declaration
@@ -197,7 +198,7 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
197198 addDataType moduleName dtype name args' dctors ctorKind
198199 return $ DataDeclaration dtype name args dctors
199200 where
200− checkNewtype :: [(ProperName, [Type])] -> m ()
201+ checkNewtype :: [(ProperName 'ConstructorName, [Type])] -> m ()
201202 checkNewtype [(_, [_])] = return ()
202203 checkNewtype [(_, _)] = throwError . errorMessage $ InvalidNewtype name
203204 checkNewtype _ = throwError . errorMessage $ InvalidNewtype name
@@ -308,7 +309,7 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
308309 | otherwise = firstDuplicate xs
309310 firstDuplicate _ = Nothing
310311
311− checkOrphanInstance :: Ident -> Qualified ProperName -> [Type] -> m ()
312+ checkOrphanInstance :: Ident -> Qualified (ProperName 'ClassName) -> [Type] -> m ()
312313 checkOrphanInstance dictName className@(Qualified (Just mn') _) tys'
313314 | moduleName == mn' || any checkType tys' = return ()
314315 | otherwise = throwError . errorMessage $ OrphanInstance dictName className tys'
@@ -335,10 +336,11 @@ typeCheckAll moduleName _ ds = traverse go ds <* traverse_ checkFixities ds
335336-- Type check an entire module and ensure all types and classes defined within the module that are
336337-- required by exported members are also exported.
337338--
338−typeCheckModule :: forall m.
339− (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
340− Module ->
341− m Module
339+typeCheckModule
340+ :: forall m
341+ . (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m)
342+ => Module
343+ -> m Module
342344typeCheckModule (Module _ _ _ _ Nothing) = internalError "exports should have been elaborated"
343345typeCheckModule (Module ss coms mn decls (Just exps)) = warnAndRethrow (addHint (ErrorInModule mn)) $ do
344346 modify (\s -> s { checkCurrentModule = Just mn })
@@ -403,7 +405,7 @@ typeCheckModule (Module ss coms mn decls (Just exps)) = warnAndRethrow (addHint
403405 where
404406 go (ConstrainedType cs _) = mapMaybe (fmap TypeClassRef . extractCurrentModuleClass . fst) cs
405407 go _ = []
406− extractCurrentModuleClass :: Qualified ProperName -> Maybe ProperName
408+ extractCurrentModuleClass :: Qualified (ProperName 'ClassName) -> Maybe (ProperName 'ClassName)
407409 extractCurrentModuleClass (Qualified (Just mn') name) | mn == mn' = Just name
408410 extractCurrentModuleClass _ = Nothing
409411