+ | Fn_e matches =>
+ let
+ val dom = newTyvar false
+ val ran = newTyvar false
+
+ fun folder ((p, e'), (first, str)) =
+ let
+ val (pty, vars', ps) = xpat state p
+
+ val _ = unify state (pos, dom, pty)
+
+ val (ty', str') = xexp (addVars (state, vars')) e'
+ in
+ unify state (pos, ty', ran);
+ (false,
+ str ^ (if first then " " else " | ") ^ "(" ^ ps ^ ") => " ^
+ str' ^ "\n")
+ end
+ val (_, str) =
+ foldl folder (true, "(fn \n") matches
+ val str = str ^ ")\n"
+ in
+ (BasicTypes.--> (dom, ran), str)
+ end
+ | Raise_e e =>
+ let
+ val (ty, es) = xexp state e
+ in
+ unify state (pos, ty, BasicTypes.exnTy);
+ (newTyvar false, "(raise (" ^ es ^ "))")
+ end