@@ -1,23 +1,11 @@
1−-----------------------------------------------------------------------------
3−-- Module : Language.PureScript.TypeChecker.Types
4−-- Copyright : (c) Phil Freeman 2013
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
8−-- Stability : experimental
12−-- This module implements the type checker
14−-----------------------------------------------------------------------------
16{-# LANGUAGE FlexibleContexts #-}
1{-# LANGUAGE FlexibleContexts #-}
17{-# LANGUAGE ScopedTypeVariables #-}
2{-# LANGUAGE ScopedTypeVariables #-}
18{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE MultiParamTypeClasses #-}
19{-# LANGUAGE OverloadedStrings #-}
4{-# LANGUAGE OverloadedStrings #-}
7+-- This module implements the type checker
21module Language.PureScript.TypeChecker.Types (
9module Language.PureScript.TypeChecker.Types (
@@ -48,6 +36,7 @@ import qualified Data.Map as M
49import Control.Monad
37import Control.Monad
50import Control.Monad.State.Class (MonadState(..), gets)
38import Control.Monad.State.Class (MonadState(..), gets)
39+import Control.Monad.Supply.Class (MonadSupply)
51import Control.Monad.Error.Class (MonadError(..))
40import Control.Monad.Error.Class (MonadError(..))
52import Control.Monad.Writer.Class (MonadWriter(..))
41import Control.Monad.Writer.Class (MonadWriter(..))
@@ -72,7 +61,7 @@ import Language.PureScript.Types
72-- | Infer the types of multiple mutually-recursive values, and return elaborated values including
61-- | Infer the types of multiple mutually-recursive values, and return elaborated values including
73-- type class dictionaries and type annotations.
62-- type class dictionaries and type annotations.
75− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
64+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
76 ModuleName ->
65 ModuleName ->
77 [(Ident, Expr)] ->
66 [(Ident, Expr)] ->
78 m [(Ident, (Expr, Type))]
67 m [(Ident, (Expr, Type))]
@@ -129,7 +118,7 @@ typeDictionaryForBindingGroup moduleName vals = do
129 return (untyped, typed, dict, untypedDict)
118 return (untyped, typed, dict, untypedDict)
131checkTypedBindingGroupElement ::
120checkTypedBindingGroupElement ::
132− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
121+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
133 ModuleName ->
122 ModuleName ->
134 (Ident, (Expr, Type, Bool)) ->
123 (Ident, (Expr, Type, Bool)) ->
135 TypeData ->
124 TypeData ->
@@ -148,7 +137,7 @@ checkTypedBindingGroupElement mn (ident, (val', ty, checkType)) dict = do
148 return (ident, (val'', ty''))
137 return (ident, (val'', ty''))
150typeForBindingGroupElement ::
139typeForBindingGroupElement ::
151− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
140+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
153 (Ident, Expr) ->
142 (Ident, Expr) ->
154 TypeData ->
143 TypeData ->
@@ -218,14 +207,14 @@ instantiatePolyTypeWithUnknowns val ty = return (val, ty)
219-- | Infer a type for a value, rethrowing any error to provide a more useful error message
208-- | Infer a type for a value, rethrowing any error to provide a more useful error message
221− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
210+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
224infer val = rethrow (addHint (ErrorInferringType val)) $ infer' val
213infer val = rethrow (addHint (ErrorInferringType val)) $ infer' val
226-- | Infer a type for a value
215-- | Infer a type for a value
228− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
217+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
231infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
220infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
@@ -312,7 +301,7 @@ infer' (PositionedValue pos _ val) = warnAndRethrowWithPosition pos $ infer' val
312infer' _ = internalError "Invalid argument to infer"
301infer' _ = internalError "Invalid argument to infer"
314inferLetBinding ::
303inferLetBinding ::
315− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
304+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
316 [Declaration] ->
305 [Declaration] ->
317 [Declaration] ->
306 [Declaration] ->
@@ -423,7 +412,7 @@ binderRequiresMonotype _ = True
424-- | Instantiate polytypes only when necessitated by a binder.
413-- | Instantiate polytypes only when necessitated by a binder.
425instantiateForBinders ::
414instantiateForBinders ::
426− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
415+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
427 [Expr] ->
416 [Expr] ->
428 [CaseAlternative] ->
417 [CaseAlternative] ->
429 m ([Expr], [Type])
418 m ([Expr], [Type])
@@ -440,7 +429,7 @@ instantiateForBinders vals cas = unzip <$> zipWithM (\val inst -> do
440-- Check the types of the return values in a set of binders in a case statement
429-- Check the types of the return values in a set of binders in a case statement
442checkBinders ::
431checkBinders ::
443− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
432+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
444 [Type] ->
433 [Type] ->
446 [CaseAlternative] ->
435 [CaseAlternative] ->
@@ -470,7 +459,7 @@ checkBinders nvals ret (CaseAlternative binders result : bs) = do
470-- Check the type of a value, rethrowing errors to provide a better error message
459-- Check the type of a value, rethrowing errors to provide a better error message
473− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
462+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
@@ -480,7 +469,7 @@ check val ty = rethrow (addHint (ErrorCheckingType val ty)) $ check' val ty
480-- Check the type of a value
469-- Check the type of a value
482check' :: forall m.
471check' :: forall m.
483− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
472+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
@@ -495,9 +484,8 @@ check' val (ForAll ident ty _) = do
495 val' <- check skVal sk
484 val' <- check skVal sk
496 return $ TypedValue True val' (ForAll ident ty (Just scope))
485 return $ TypedValue True val' (ForAll ident ty (Just scope))
497check' val t@(ConstrainedType constraints ty) = do
486check' val t@(ConstrainedType constraints ty) = do
498− dictNames <- forM constraints $ \(Qualified _ (ProperName className), _) -> do
487+ dictNames <- forM constraints $ \(Qualified _ (ProperName className), _) ->
499− n <- freshDictionaryName
488+ freshIdent ("dict" ++ className)
500− return $ Ident $ "__dict_" ++ className ++ "_" ++ show n
501 dicts <- join <$> zipWithM (newDictionaries []) (map (Qualified Nothing) dictNames) constraints
489 dicts <- join <$> zipWithM (newDictionaries []) (map (Qualified Nothing) dictNames) constraints
502 val' <- withBindingGroupVisible $ withTypeClassDictionaries dicts $ check val ty
490 val' <- withBindingGroupVisible $ withTypeClassDictionaries dicts $ check val ty
503 return $ TypedValue True (foldr (Abs . Left) val' dictNames) t
491 return $ TypedValue True (foldr (Abs . Left) val' dictNames) t
@@ -639,7 +627,7 @@ check' val ty = do
639-- The @lax@ parameter controls whether or not every record member has to be provided. For object updates, this is not the case.
627-- The @lax@ parameter controls whether or not every record member has to be provided. For object updates, this is not the case.
641checkProperties ::
629checkProperties ::
642− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
630+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
644 [(String, Expr)] ->
632 [(String, Expr)] ->
@@ -671,7 +659,7 @@ checkProperties expr ps row lax = let (ts, r') = rowToList row in go ps ts r' wh
672-- | Check the type of a function application, rethrowing errors to provide a better error message
660-- | Check the type of a function application, rethrowing errors to provide a better error message
673checkFunctionApplication ::
661checkFunctionApplication ::
674− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
662+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
@@ -683,7 +671,7 @@ checkFunctionApplication fn fnTy arg ret = rethrow (addHint (ErrorInApplication
684-- | Check the type of a function application
672-- | Check the type of a function application
685checkFunctionApplication' ::
673checkFunctionApplication' ::
686− (Functor m, Applicative m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>
674+ (Functor m, Applicative m, MonadSupply m, MonadState CheckState m, MonadError MultipleErrors m, MonadWriter MultipleErrors m) =>