α × α → β × β *) let map pair = λ f. λ x. (f(fst(x), f(snd(x)))) let int pair = map pair int of float (3.14, 2.718) มޙ let int pair = let y = map pair (λ x. wrap(int) (int of float (unwrap(float)(x)))) (wrap(float)(3.14), wrap(float)(2.718)) in (unwrap(int)(fst(y)), unwrap(int)(snd(y))) ଟ૬తͳ box Խ͞Ε͍ͯΔ͜ͱʹҙɻ ଟ૬ؔͷݺͼग़͠ଆͰ unbox ͯ͠Δɻ 14 / 37
E + id : ∀α.α → α ρ = α ← int (E + x : α)(x) = α Dom(∅) ⊆ ∅ E + x : α ⊢ x : α E ⊢ λx.x : α → α E′′(id) = ∀α.α → α Dom(ρ) ⊆ {α} E′′ ⊢ id : ρ(α → α) = int → int E′′ ⊢ 14 : int E′′ = E + id : ∀α.α → α ⊢ id 14 : int E ⊢ λx.x : α → α E + id : Gen(α → α, E) ⊢ id 14 : int E ⊢ let id = λx.x in id 14 : int 19 / 37
ʹͰ͖ͳ͍!!! (* list ͷ ఆ ٛ *) datatype ’a list = Nil | Cons of ’a * ’a list fun length Nil = 0 (* length : ’a list -> int *) | length (Cons e, l) = 1 + length l Cons(3.14, Nil) ϑϥοτʹѻ͑ΕۭؒޮΑͦ͞͏ ͔͠͠ length ؔʹ͜ͷϦετΛ͢͜ͱΛߟ͑Δͱ·͍ͣ 29 / 37
࠷ॳͷ make_pair ͷྫͰ α ∗ α ܕͷ͔Β fst,snd ͰΛऔΓ ग़ͯ͠͏Ұ pair Λ࡞͍ͬͯΔ • List ’a list ΛҾʹͱΔଟ૬ؔʹ͢ͱ͖ʹɺ࡞Γͳ͓ͤ ྑ͍ʁ ⇒ ࡞Γ͢ͷ࣌ؒతʹۭؒతʹίετ͕ॏ͍ʜ List ͷΑ͏ͳߏ flat ʹͰ͖ͳ͍ʜɻͭΒ͍ɻͭΒ͍ɻ Table: flat list Table: a little nested list 30 / 37