@@ -1,23 +1,11 @@
1−-----------------------------------------------------------------------------
2−--
3−-- Module : Language.PureScript.TypeChecker.Types
4−-- Copyright : (c) Phil Freeman 2013
5−-- License : MIT
6−--
7−-- Maintainer : Phil Freeman <paf31@cantab.net>
8−-- Stability : experimental
9−-- Portability :
10−--
11−-- |
12−-- This module implements the type checker
13−--
14−-----------------------------------------------------------------------------
15−
161{-# LANGUAGE FlexibleContexts #-}
172{-# LANGUAGE ScopedTypeVariables #-}
183{-# LANGUAGE MultiParamTypeClasses #-}
194{-# LANGUAGE OverloadedStrings #-}
205
6+-- |
7+-- This module implements the type checker
8+--
219module Language.PureScript.TypeChecker.Types (
2210 typesOf
2311) where
@@ -48,6 +36,7 @@ import qualified Data.Map as M
4836
4937import Control.Monad
5038import Control.Monad.State.Class (MonadState(..), gets)
39+import Control.Monad.Supply.Class (MonadSupply)
5140import Control.Monad.Error.Class (MonadError(..))
5241import Control.Monad.Writer.Class (MonadWriter(..))
5342
@@ -72,7 +61,7 @@ import Language.PureScript.Types
7261-- | Infer the types of multiple mutually-recursive values, and return elaborated values including
7362-- type class dictionaries and type annotations.
7463typesOf ::
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) =>
7665 ModuleName ->
7766 [(Ident, Expr)] ->
7867 m [(Ident, (Expr, Type))]
@@ -129,7 +118,7 @@ typeDictionaryForBindingGroup moduleName vals = do
129118 return (untyped, typed, dict, untypedDict)
130119
131120checkTypedBindingGroupElement ::
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) =>
133122 ModuleName ->
134123 (Ident, (Expr, Type, Bool)) ->
135124 TypeData ->
@@ -148,7 +137,7 @@ checkTypedBindingGroupElement mn (ident, (val', ty, checkType)) dict = do
148137 return (ident, (val'', ty''))
149138
150139typeForBindingGroupElement ::
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) =>
152141 Bool ->
153142 (Ident, Expr) ->
154143 TypeData ->
@@ -218,14 +207,14 @@ instantiatePolyTypeWithUnknowns val ty = return (val, ty)
218207
219208-- | Infer a type for a value, rethrowing any error to provide a more useful error message
220209infer ::
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) =>
222211 Expr ->
223212 m Expr
224213infer val = rethrow (addHint (ErrorInferringType val)) $ infer' val
225214
226215-- | Infer a type for a value
227216infer' ::
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) =>
229218 Expr ->
230219 m Expr
231220infer' v@(NumericLiteral (Left _)) = return $ TypedValue True v tyInt
@@ -312,7 +301,7 @@ infer' (PositionedValue pos _ val) = warnAndRethrowWithPosition pos $ infer' val
312301infer' _ = internalError "Invalid argument to infer"
313302
314303inferLetBinding ::
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) =>
316305 [Declaration] ->
317306 [Declaration] ->
318307 Expr ->
@@ -423,7 +412,7 @@ binderRequiresMonotype _ = True
423412
424413-- | Instantiate polytypes only when necessitated by a binder.
425414instantiateForBinders ::
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) =>
427416 [Expr] ->
428417 [CaseAlternative] ->
429418 m ([Expr], [Type])
@@ -440,7 +429,7 @@ instantiateForBinders vals cas = unzip <$> zipWithM (\val inst -> do
440429-- Check the types of the return values in a set of binders in a case statement
441430--
442431checkBinders ::
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) =>
444433 [Type] ->
445434 Type ->
446435 [CaseAlternative] ->
@@ -470,7 +459,7 @@ checkBinders nvals ret (CaseAlternative binders result : bs) = do
470459-- Check the type of a value, rethrowing errors to provide a better error message
471460--
472461check ::
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) =>
474463 Expr ->
475464 Type ->
476465 m Expr
@@ -480,7 +469,7 @@ check val ty = rethrow (addHint (ErrorCheckingType val ty)) $ check' val ty
480469-- Check the type of a value
481470--
482471check' :: 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) =>
484473 Expr ->
485474 Type ->
486475 m Expr
@@ -495,9 +484,8 @@ check' val (ForAll ident ty _) = do
495484 val' <- check skVal sk
496485 return $ TypedValue True val' (ForAll ident ty (Just scope))
497486check' val t@(ConstrainedType constraints ty) = do
498− dictNames <- forM constraints $ \(Qualified _ (ProperName className), _) -> do
499− n <- freshDictionaryName
500− return $ Ident $ "__dict_" ++ className ++ "_" ++ show n
487+ dictNames <- forM constraints $ \(Qualified _ (ProperName className), _) ->
488+ freshIdent ("dict" ++ className)
501489 dicts <- join <$> zipWithM (newDictionaries []) (map (Qualified Nothing) dictNames) constraints
502490 val' <- withBindingGroupVisible $ withTypeClassDictionaries dicts $ check val ty
503491 return $ TypedValue True (foldr (Abs . Left) val' dictNames) t
@@ -639,7 +627,7 @@ check' val ty = do
639627-- The @lax@ parameter controls whether or not every record member has to be provided. For object updates, this is not the case.
640628--
641629checkProperties ::
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) =>
643631 Expr ->
644632 [(String, Expr)] ->
645633 Type ->
@@ -671,7 +659,7 @@ checkProperties expr ps row lax = let (ts, r') = rowToList row in go ps ts r' wh
671659
672660-- | Check the type of a function application, rethrowing errors to provide a better error message
673661checkFunctionApplication ::
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) =>
675663 Expr ->
676664 Type ->
677665 Expr ->
@@ -683,7 +671,7 @@ checkFunctionApplication fn fnTy arg ret = rethrow (addHint (ErrorInApplication
683671
684672-- | Check the type of a function application
685673checkFunctionApplication' ::
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) =>
687675 Expr ->
688676 Type ->
689677 Expr ->