@@ -3,6 +3,7 @@ module Constrain where
5import Types
5import Types
6+import Data.List (foldl')
6import qualified Data.Set as Set
7import qualified Data.Set as Set
7import qualified Data.Map as Map
8import qualified Data.Map as Map
8import Control.Monad (liftM,mapM)
9import Control.Monad (liftM,mapM)
@@ -60,7 +61,7 @@ inference (If e1 e2 e3) =
60 , Set.unions [c1,c2,c3, Set.fromList [ t1 :=: BoolT, t2 :=: t3 ] ]
61 , Set.unions [c1,c2,c3, Set.fromList [ t1 :=: BoolT, t2 :=: t3 ] ]
63−inference (Data name es) = inference $ foldl App (Var name) es
64+inference (Data name es) = inference $ foldl' App (Var name) es
64inference (Binop op e1 e2) = inference (Var op `App` e1 `App` e2)
65inference (Binop op e1 e2) = inference (Var op `App` e1 `App` e2)
65inference (Access (Var x) y) = inference . Var $ x ++ "." ++ y
66inference (Access (Var x) y) = inference . Var $ x ++ "." ++ y
66inference (Range e1 e2) = inference (Var "elmRange" `App` e1 `App` e2)
67inference (Range e1 e2) = inference (Var "elmRange" `App` e1 `App` e2)
@@ -69,16 +70,8 @@ inference other =
69 case other of
70 case other of
70 Number _ -> primitive IntT
71 Number _ -> primitive IntT
71 Chr _ -> primitive CharT
72 Chr _ -> primitive CharT
73+ Str _ -> primitive string
72 Boolean _ -> primitive BoolT
74 Boolean _ -> primitive BoolT
73 _ -> beta >>= primitive
75 _ -> beta >>= primitive
75primitive t = return (Map.empty, Set.empty, t)
77primitive t = return (Map.empty, Set.empty, t)
78− do (a1,c1,t1) <- inference e1
79− (a2,c2,t2) <- inference e2
80− let ts = Map.findWithDefault (error "inference") x a
81− return ( unionA a1 $ Map.delete x a2
82− , Set.unions [ c1, c2, Set.fromList $ map (:<: t1) ts ]