Ͱ͖Δ͜ͱ module A { let add x y = x + y ;; let x = add 1 2 ;; let add1 = add 1 ;; let y = add1 10 ;; let app f x = f x ;; let z = app (fun x => x + 1) 1 ;; let num_to_str n: int = java.lang.Integer##toString(n) ;; } ؔఆٛͱݺͼग़͠ ෦ద༻ Javaϝιουݺͼग़͠ ߴ֊ؔ
Ͱ͖Δ͜ͱ module A { let s = if x == y then "eq" else "neq" let f x = let tmp = x + 1 in x * tmp ;; let x = let rec f x = g x g x = f x in f 0 ;; } ੍ޚߏจ ϩʔΧϧม ࠶ؼ
Ͱ͖Δ͜ͱ module A { let id x = x ;; // id: [?1] ?1 -> ?1 data Option a = Some a | None ;; let get_or_else o x = match o | Some a => a | None => x ;; let option_value = Some 1 ;; let value = get_or_else option_value 100 ;; } ύϥϝʔλଟ૬ ܕਪ ଟ૬ͳతσʔλܕ ύλʔϯϚον
• ͯ͢ͷؔ1Ҿ module A { let f x = x + 1 ;; } class A { static Fun f; static { A.f = new A$0(); } } class A$0 extends Fun { override def app(x: Object) = (int)x + 1; }
• ؔΦϒδΣΫτ֎ଆͷؔͷࢀরΛ௨ͯ͡ҾʹΞ ΫηεͰ͖Δ fun x y = x + y class A$0 extends Fun { def app(x: Object) = return new A$1( local=x, parent=this) } class A$1 extends Fun { def app(arg: Object) = { val x = (int)parent.local; val y = (int)arg; x + y } }
ΫϥεϑΝΠϧͷม • ࠶ؼతࢀরΛ࣮ݱ͢ΔͨΊɺࣄલʹՄมྻΛڞ༗͓ͯ͠ ͍ͯޙ͔ΒࢀরΛઃఆ let rec f x = g x g x = f x in f val env = Array[Object](null, null) val f = A$0(env, null) val g = A$1(env, null) env(0) = f env(1) = g return f // f.local(0) == f, f.local(1) == g
ΫϥεϑΝΠϧͷม • తσʔλܕΫϥε֊ͱͯ͠දݱ data Option a = Some a | None abstract class Option extends Data class Option$Some(val v0: Object) extends Option class Option$None() extends Option
ΫϥεϑΝΠϧͷม • తσʔλܕͷύλʔϯϚοννΣοΫؔ+ͷऔ Γग़ؔ͠Ͱ࣮ݱ match value | Some a => a | None => x if(some_check(value)) return some_get0(value) else if(none_check(value)) return x def some_check(value) = value.isInstanceOf[Option$Some] def some_get0(value) = value.asInstanceOf[Option$Some] .v0