| TUnif of string * typ option ref
(* Unification variable to be determined during type-checking *)
withtype typ = typ' * position
- and record = typ StringMap.map
+ and record = (typ' * position) StringMap.map
datatype exp' =
EInt of int
(* Do-nothing action *)
| ESet of string * exp
(* Set an environment variable *)
- | EGet of string * string * exp
+ | EGet of string * typ option * string * exp
(* Get an environment variable *)
| ESeq of exp list
(* Monad sequencer; execute a number of commands in order *)
fun multiApp (f, loc, args) =
foldl (fn (arg, e) => (EApp (e, arg), loc)) f args
+datatype unification_error =
+ UnifyPred of pred * pred
+ | UnifyTyp of typ * typ
+ | UnifyOccurs of string * typ
+
+exception Unify of unification_error
+
+datatype type_error =
+ WrongType of string * exp * typ * typ * unification_error option
+ | WrongForm of string * string * exp * typ * unification_error option
+ | UnboundVariable of string
+ | WrongPred of string * pred * pred
+
end