@@ -43,11 +43,11 @@ lineTypes = [ numScheme (\n -> listOf (pairOf n) ==> line) "line"
4343 , "customLine" -: listOf int ==> color ==> line ==> form
4444 ] ++ hasType (color ==> line ==> form) ["solid","dashed","dotted"]
4545
46−shapes = [ numScheme (\n -> listOf (pairOf n) ==> pairOf n ==> shape) "polygon"
46+shapes = [ twoNums (\n m -> listOf (pairOf n) ==> pairOf m ==> shape) "polygon"
4747 , "filled" -: color ==> shape ==> form
4848 , "outlined" -: color ==> shape ==> form
4949 , "customOutline" -: listOf int ==> color ==> shape ==> form
50− ] ++ map (numScheme (\n -> n ==> n ==> pairOf n ==> shape)) [ "ngon"
50+ ] ++ map (twoNums (\n m -> n ==> n ==> pairOf m ==> shape)) [ "ngon"
5151 , "rect"
5252 , "oval" ]
5353
@@ -130,6 +130,9 @@ concreteSignals =
130130binop t = t ==> t ==> t
131131numScheme t name = (name, Forall [0] [VarT 0 :<: number] (t (VarT 0)))
132132timeScheme name t = (name, Forall [0] [VarT 0 :<: time] (t (VarT 0)))
133+twoNums f name =
134+ (,) name . Forall [0,1] [ VarT 0 :<: number, VarT 1 :<: number ] $
135+ f (VarT 0) (VarT 1)
133136
134137math =
135138 map (numScheme (\t -> t ==> binop t)) ["clamp"] ++
@@ -137,7 +140,10 @@ math =
137140 [ numScheme (\t -> t ==> t) "abs" ] ++
138141 hasType (binop float) [ "/", "logBase" ] ++
139142 hasType (binop int) ["rem","div","mod"] ++
140− hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"]
143+ hasType (float ==> float) ["sin","cos","tan","asin","acos","atan","sqrt"] ++
144+ hasType float ["pi","e"] ++
145+ hasType (int ==> float) ["toFloat","castIntToFloat"] ++
146+ hasType (float ==> int) ["round","floor","ceiling","truncate"]
141147
142148bools =
143149 [ "not" -: bool ==> bool ] ++
@@ -163,7 +169,7 @@ funcs =
163169 , "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
164170 , "$" -:: (a ==> b) ==> a ==> b
165171 , ":" -:: a ==> listOf a ==> listOf a
166− , "++" -:: a ==> a ==> a
172+ , (,) "++" . Forall [0,1] [ VarT 0 :<: appendable (VarT 1) ] $ VarT 0 ==> VarT 0 ==> VarT 0
167173 , "Cons" -:: a ==> listOf a ==> listOf a
168174 , "Nil" -:: listOf a
169175 , "Just" -:: a ==> maybeOf a
@@ -184,19 +190,22 @@ lists =
184190 , "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
185191 , "forall" -:: (a ==> bool) ==> listOf a ==> bool
186192 , "exists" -:: (a ==> bool) ==> listOf a ==> bool
187− , "concat" -:: listOf (listOf a) ==> listOf a
188193 , "reverse" -:: listOf a ==> listOf a
189194 , "take" -:: int ==> listOf a ==> listOf a
190195 , "drop" -:: int ==> listOf a ==> listOf a
191196 , "partition" -:: (a ==> bool) ==> listOf a ==> tupleOf [listOf a,listOf a]
192197 , "intersperse" -:: a ==> listOf a ==> listOf a
193− , "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
194198 , "zip" -:: listOf a ==>listOf b ==>listOf(tupleOf [a,b])
195199 , "map" -:: (a ==> b) ==> listOf a ==> listOf b
196200 , "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
197201 , "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
198202 , "scanl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> listOf b
199− , "concatMap" -:: (a ==> listOf b) ==> listOf a ==> listOf b
203+ , (,) "concat" . Forall [0,1] [ VarT 0 :<: appendable (VarT 1) ] $
204+ listOf (VarT 0) ==> VarT 0
205+ , (,) "concatMap" . Forall [0,1,2] [ VarT 0 :<: appendable (VarT 1) ] $
206+ (VarT 2 ==> VarT 0) ==> listOf (VarT 2) ==> VarT 0
207+ , (,) "intercalate" . Forall [0,1] [ VarT 0 :<: appendable (VarT 1) ] $
208+ VarT 0 ==> listOf (VarT 0) ==> VarT 0
200209 , "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
201210 ] ++ map (numScheme (\n -> listOf n ==> n)) [ "sum", "product"
202211 , "maximum", "minimum" ]