21. • case
sealed abstract class Term
//
case class Var(name : String) extends Term
// λ fn x => x + 1
case class Lambda(arg : String,body : Term) extends Term
// f x
case class Apply(f : Term,arg : Term) extends Term
...
21
23. •
def eval(term : Term) : Term =
term match {
//
case Var(_) | Lambda(_,_) | ... =>
term
// f x
case Apply(Lambda(x,body),y @ Value()) =>
body.subst(x -> y).eval
// f x f x
case Apply(x @ Value(),y) =>
Apply(x,y eval).eval
// f x f
case Apply(x,y) =>
Apply(x eval,y).eval
....
}
23
24. • case
• (ry
sealed abstract class Type
// Int
case class Int() extends Type
// Bool
case class Bool() extends Type
//
case class TVar(name : String) extends Type
//
case class ->:(from : Type,to : Type) extends Type
24
25. :
plus1 : int -> int
:
x :α
let plus2 x =
→ plus1 : α -> β
plus1 (plus1 x)
→ plus1 : β ->γ
plus2 : α -> γ
( ):
plus2 : int -> int
25
26. def constrain(term : Term, env : Map[String,Type]) :
(Type,TypeConstrain) =
term match {
case Var(name) =>
//
(env(name),TypeConstrain())
case Lambda(arg,body) =>
// λ
val x = TypeInfer gensym
val (t,c) = body.constrain(env + (arg -> x))
(x ->: t,c)
case Apply(f,arg) =>
//
val (t1,c1) = f constrain env
val (t2,c2) = arg constrain env
val x = TypeInfer gensym
val c = c1 ++ c2 + (t1 -> (t2 ->: x))
(x,c)
... 26
}
27. ( )
def unify() : Map[String,Type] =
types match {
case List() =>
Map()
case x::xs =>
val ys = new TypeConstrain(xs)
x match {
case (s,t) if(s == t) =>
ys unify
....
}
}
27