@@ -4,6 +4,7 @@ module Types.Constrain (constrain) where
44import Control.Arrow (second)
55import Control.Monad (liftM,mapM,zipWithM,foldM)
66import Control.Monad.State (evalState)
7+import Data.Char (isDigit)
78import Data.List (foldl',sort,group,isPrefixOf,intercalate,isSuffixOf)
89import qualified Data.Map as Map
910import qualified Data.Set as Set
@@ -11,6 +12,7 @@ import qualified Data.Set as Set
1112import Ast
1213import Context
1314import Guid
15+import qualified Libraries as Libraries
1416
1517import Types.Types
1618import Types.Substitutions
@@ -19,25 +21,25 @@ beta = VarT `liftM` guid
1921unionA = Map.unionWith (++)
2022unionsA = Map.unionsWith (++)
2123
22−getAliases imports hints = hints ++ concatMap aliasesFrom imports'
23− where imports' = map head . group $ sort imports
24− aliasesFrom (name,method) =
25− case method of
26− As alias -> concatMap (findAlias name alias) hints
27− _ -> []
28− findAlias mName' mAlias (name,tipe) =
29− let mName = mName' ++ "." in
30− case mName `isPrefixOf` name of
31− True -> [ (mAlias ++ drop (length mName) name, tipe) ]
32− False -> []
24+getAliases imports hints = hints ++ concatMap aliasesFrom imports
25+ where aliasesFrom (name,method) =
26+ let values = concatMap (getValue name) hints
27+ in case method of
28+ As alias -> map (\(n,t) -> (alias ++ "." ++ n, t)) values
29+ Hiding vs -> filter (\(n,t) -> n `notElem` vs) values
30+ Importing vs -> filter (\(n,t) -> n `elem` vs) values
31+ getValue inModule (name,tipe) =
32+ case inModule `isPrefixOf` name of
33+ True -> [ (drop (length inModule + 1) name, tipe) ]
34+ False -> []
3335
3436findAmbiguous hints hints' assumptions continue =
35− let potentialDups = map head . filter (\g -> length g > 1) . group $ sort hints'
36− dups = filter (\k -> Map.member k assumptions) potentialDups
37− in case dups of
38− n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++ "' could refer to " ++
39− intercalate ", " (filter (isSuffixOf n) hints)
40− _ -> continue
37+ let potentialDups = map head . filter (\g -> length g > 1) . group $ sort hints'
38+ dups = filter (\k -> Map.member k assumptions) potentialDups
39+ in case dups of
40+ n:_ -> return . Left $ "Error: Ambiguous occurrence of '" ++ n ++
41+ "' could refer to " ++ intercalate ", " (filter (isSuffixOf n) hints)
42+ _ -> continue
4143
4244mergeSchemes :: [Map.Map String Scheme]
4345 -> GuidCounter (TVarMap, ConstraintSet, Map.Map String Scheme)
@@ -62,9 +64,7 @@ constrain typeHints (Module _ _ imports stmts) = do
6264 (as', cs', schemes) <- mergeSchemes schemess
6365 let constraints = Set.unions (cs':css)
6466 as = unionsA (as':ass)
65− extraImports = ("Time", Importing []) : map (\n -> (n, Importing []))
66− ["List","Signal","Text","Graphics","Color"]
67− aliasHints = getAliases (imports ++ extraImports) hints
67+ aliasHints = getAliases (imports ++ Libraries.prelude) hints
6868 allHints = Map.union schemes (Map.fromList aliasHints)
6969 insert as n = do v <- guid; return $ Map.insertWith' (\_ x -> x) n [v] as
7070 assumptions <- foldM insert as (Map.keys schemes)