Commit 431a0941 by Mark Cohen

tyscheme if necessary

parent 412d34d1
Showing with 39 additions and 0 deletions
structure TyScheme: sig
type tyScheme = {sigmas: string list, rhos: (string * Ty.ty) list, tau: Ty.ty}
val generalize: Ty.ty -> tyScheme
val instantiate: tyScheme -> Ty.ty
val untyScheme: tyScheme -> string
end = struct
type tyScheme = {sigmas: string list, rhos: (string * Ty.ty) list, tau: Ty.ty}
local open Ty in
fun freeVars (Unit | Bool | Int) = []
| freeVars (List ty) = freeVars ty
| freeVars (Pair (ty1, ty2)) = (freeVars ty1) @ (freeVars ty2)
| freeVars (Option ty) = freeVars ty
| freeVars (Fun (ty1, ty2)) = (freeVars ty1) @ (freeVars ty2)
| freeVars (TyVar a) = [a]
end
fun generalize ty =
{sigmas = freeVars ty, rhos = [], tau = ty}
fun instantiate {sigmas = sigmas, rhos = _, tau = ty} =
foldl (fn (a, inner) => Unify.subst (Ty.freshTyVar ()) a inner) ty sigmas
local open Utils in
fun untyScheme {sigmas = sigmas, rhos = rhos, tau = ty} =
cat (
(map (fn a => cat ["\\/", a, "."]) sigmas) @
(map (fn (x, t) => (paren o spc) [x, "::", Ty.unty t]) rhos) @
[Ty.unty ty]
)
end
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment