on master help sign in
Overload literal numbers without a decimal point to be either Ints or Floats
d456cecEvan Czaplicki
compiler/Type/Constrain/Expression.hs+1−1
@@ -52,7 +52,7 @@ constrain :: Env.Environment -> LExpr a b -> Type -> IO TypeConstraint
52constrain env (L _ _ expr) tipe =
52constrain env (L _ _ expr) tipe =
53 let list t = TermN (App1 (Env.get env Env.types "_List") t) in
53 let list t = TermN (App1 (Env.get env Env.types "_List") t) in
54 case expr of
54 case expr of
55− Literal lit -> return $ Literal.constrain env lit tipe
55+ Literal lit -> Literal.constrain env lit tipe
56
56
57 Var name -> return (name <? tipe)
57 Var name -> return (name <? tipe)
58
58
compiler/Type/Constrain/Literal.hs+6−6
@@ -8,12 +8,12 @@ import Type.Type
8import Type.Fragment
8import Type.Fragment
9import Type.Environment as Env
9import Type.Environment as Env
10
10
11−constrain :: Environment -> Literal -> Type -> TypeConstraint
11+constrain :: Environment -> Literal -> Type -> IO TypeConstraint
12constrain env literal tipe =
12constrain env literal tipe =
13 let prim name = Env.get env Env.types name in
13 let prim name = Env.get env Env.types name in
14 case literal of
14 case literal of
15− IntNum _ -> tipe === prim "Int"
15+ IntNum _ -> fmap (\n -> tipe === VarN n) number
16− FloatNum _ -> tipe === prim "Float"
16+ FloatNum _ -> return $ tipe === prim "Float"
17− Chr _ -> tipe === prim "Char"
17+ Chr _ -> return $ tipe === prim "Char"
18− Str _ -> tipe === TermN (App1 (prim "[]") (prim "Char"))
18+ Str _ -> return $ tipe === TermN (App1 (prim "[]") (prim "Char"))
19− Boolean _ -> tipe === prim "Bool"
19+ Boolean _ -> return $ tipe === prim "Bool"
compiler/Type/Constrain/Pattern.hs+3−4
@@ -20,10 +20,9 @@ constrain env pattern tipe =
20 case pattern of
20 case pattern of
21 PAnything -> return emptyFragment
21 PAnything -> return emptyFragment
22
22
23− PLiteral lit ->
23+ PLiteral lit -> do
24+ c <- Literal.constrain env lit tipe
24− return $ emptyFragment {
25+ return $ emptyFragment { typeConstraint = c }
25− typeConstraint = Literal.constrain env lit tipe
26− }
27
26
28 PVar name -> do
27 PVar name -> do
29 v <- flexibleVar
28 v <- flexibleVar