ML λ λ 1 λ 1.1 λ λ λ e (λ ) ::= x ( ) λx.e (λ ) e 1 e 2 ( ) ML λx.e Objective Caml fun x -> e x e let 1

Similar documents
# let rec sigma (f, n) = # if n = 0 then 0 else f n + sigma (f, n-1);; val sigma : (int -> int) * int -> int = <fun> sigma f n ( : * -> * ) sqsum cbsu

Parametric Polymorphism

Jacques Garrigue

koba/class/soft-kiso/ 1 λ if λx.λy.y false 0 λ typed λ-calculus λ λ 1.1 λ λ, syntax τ (types) ::= b τ 1 τ 2 τ 1

Objective Caml 3.12 Jacques Garrigue ( ) with Alain Frisch (Lexifi), OCaml developper team (INRIA)

jssst-ocaml.mgp

ML Edinburgh LCF ML Curry-Howard ML ( ) ( ) ( ) ( ) 1

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

Int Int 29 print Int fmt tostring 2 2 [19] ML ML [19] ML Emacs Standard ML M M ::= x c λx.m M M let x = M in M end (M) x c λx.

I: 2 : 3 +

.1 z = e x +xy y z y 1 1 x 0 1 z x y α β γ z = αx + βy + γ (.1) ax + by + cz = d (.1') a, b, c, d x-y-z (a, b, c). x-y-z 3 (0,

40 6 y mx x, y 0, 0 x 0. x,y 0,0 y x + y x 0 mx x + mx m + m m 7 sin y x, x x sin y x x. x sin y x,y 0,0 x 0. 8 x r cos θ y r sin θ x, y 0, 0, r 0. x,


: gettoken(1) module P = Printf exception End_of_system (* *) let _ISTREAM = ref stdin let ch = ref ( ) let read () = (let c =!ch in ch := inp

1

変 位 変位とは 物体中のある点が変形後に 別の点に異動したときの位置の変化で あり ベクトル量である 変位には 物体の変形の他に剛体運動 剛体変位 が含まれている 剛体変位 P(x, y, z) 平行移動と回転 P! (x + u, y + v, z + w) Q(x + d x, y + dy,


プログラム

日本内科学会雑誌第98巻第4号

日本内科学会雑誌第97巻第7号

x () g(x) = f(t) dt f(x), F (x) 3x () g(x) g (x) f(x), F (x) (3) h(x) = x 3x tf(t) dt.9 = {(x, y) ; x, y, x + y } f(x, y) = xy( x y). h (x) f(x), F (x

構造化プログラミングと データ抽象

Emacs ML let start ::= exp (1) exp ::= (2) fn id exp (3) ::= (4) (5) ::= id (6) const (7) (exp) (8) let val id = exp in

18 ( ) I II III A B C(100 ) 1, 2, 3, 5 I II A B (100 ) 1, 2, 3 I II A B (80 ) 6 8 I II III A B C(80 ) 1 n (1 + x) n (1) n C 1 + n C

1. A0 A B A0 A : A1,...,A5 B : B1,...,B

「計算と論理」 Software Foundations その4

Copyright c 2006 Zhenjiang Hu, All Right Reserved.

構造化プログラミングと データ抽象

平成 19 年度 ( 第 29 回 ) 数学入門公開講座テキスト ( 京都大学数理解析研究所, 平成 19 ~8 年月 72 月日開催 30 日 ) 1 PCF (Programming language for Computable Functions) PCF adequacy adequacy

( 28 ) ( ) ( ) 0 This note is c 2016, 2017 by Setsuo Taniguchi. It may be used for personal or classroom purposes, but not for commercial purp

( )/2 hara/lectures/lectures-j.html 2, {H} {T } S = {H, T } {(H, H), (H, T )} {(H, T ), (T, T )} {(H, H), (T, T )} {1

5. [1 ] 1 [], u(x, t) t c u(x, t) x (5.3) ξ x + ct, η x ct (5.4),u(x, t) ξ, η u(ξ, η), ξ t,, ( u(ξ,η) ξ η u(x, t) t ) u(x, t) { ( u(ξ, η) c t ξ ξ { (

5.. z = f(x, y) y y = b f x x g(x) f(x, b) g x ( ) A = lim h g(a + h) g(a) h g(x) a A = g (a) = f x (a, b)

untitled

Copyright c 2008 Zhenjiang Hu, All Right Reserved.

k m m d2 x i dt 2 = f i = kx i (i = 1, 2, 3 or x, y, z) f i σ ij x i e ij = 2.1 Hooke s law and elastic constants (a) x i (2.1) k m σ A σ σ σ σ f i x

II A A441 : October 02, 2014 Version : Kawahira, Tomoki TA (Kondo, Hirotaka )

e ::= c op(e 1,..., e n ) if e 1 then e 2 else e 3 let x = e 1 in e 2 x let rec x y 1... y n = e 1 in e 2 e e 1... e n (e 1,..., e n ) let (x 1,..., x

Ł\”ƒ-2005

第90回日本感染症学会学術講演会抄録(I)

5.. z = f(x, y) y y = b f x x g(x) f(x, b) g x ( ) A = lim h 0 g(a + h) g(a) h g(x) a A = g (a) = f x (a, b)

振動と波動

, = = 7 6 = 42, =

日本内科学会雑誌第102巻第4号

ML 演習 第 4 回

.....Z...^.[ \..

A

,. Black-Scholes u t t, x c u 0 t, x x u t t, x c u t, x x u t t, x + σ x u t, x + rx ut, x rux, t 0 x x,,.,. Step 3, 7,,, Step 6., Step 4,. Step 5,,.

No δs δs = r + δr r = δr (3) δs δs = r r = δr + u(r + δr, t) u(r, t) (4) δr = (δx, δy, δz) u i (r + δr, t) u i (r, t) = u i x j δx j (5) δs 2

= M + M + M + M M + =.,. f = < ρ, > ρ ρ. ρ f. = ρ = = ± = log 4 = = = ± f = k k ρ. k

「計算と論理」 Software Foundations その3

org/ghc/ Windows Linux RPM 3.2 GHCi GHC gcc javac ghc GHCi(ghci) GHCi Prelude> GHCi :load file :l file :also file :a file :reload :r :type expr :t exp

O1-1 O1-2 O1-3 O1-4 O1-5 O1-6

W u = u(x, t) u tt = a 2 u xx, a > 0 (1) D := {(x, t) : 0 x l, t 0} u (0, t) = 0, u (l, t) = 0, t 0 (2)

73


add1 2 β β - conversion (λx.x + 1(2 β x + 1 x λ f(x, y = 2 x + y 2 λ(x, y.2 x + y 1 λy.2 x + y λx.(λy.2 x + y x λy.2 x + y EXAMPLE (λ(x, y.2

放射線専門医認定試験(2009・20回)/HOHS‐05(基礎二次)

プログラム



untitled

1. (8) (1) (x + y) + (x + y) = 0 () (x + y ) 5xy = 0 (3) (x y + 3y 3 ) (x 3 + xy ) = 0 (4) x tan y x y + x = 0 (5) x = y + x + y (6) = x + y 1 x y 3 (

5 1F2F 21 1F2F

微分積分 サンプルページ この本の定価 判型などは, 以下の URL からご覧いただけます. このサンプルページの内容は, 初版 1 刷発行時のものです.


2.4 ( ) ( B ) A B F (1) W = B A F dr. A F q dr f(x,y,z) A B Γ( ) Minoru TANAKA (Osaka Univ.) I(2011), Sec p. 1/30

.5 z = a + b + c n.6 = a sin t y = b cos t dy d a e e b e + e c e e e + e 3 s36 3 a + y = a, b > b 3 s363.7 y = + 3 y = + 3 s364.8 cos a 3 s365.9 y =,


ML 演習 第 4 回

/ 2 n n n n x 1,..., x n 1 n 2 n R n n ndimensional Euclidean space R n vector point R n set space R n R n x = x 1 x n y = y 1 y n distance dx,

平成 28 年度 ( 第 38 回 ) 数学入門公開講座テキスト ( 京都大学数理解析研究所, 平成 ~8 28 月年 48 日開催月 1 日 semantics FB 1 x, y, z,... FB 1. FB (Boolean) Functional

x, y x 3 y xy 3 x 2 y + xy 2 x 3 + y 3 = x 3 y xy 3 x 2 y + xy 2 x 3 + y 3 = 15 xy (x y) (x + y) xy (x y) (x y) ( x 2 + xy + y 2) = 15 (x y)

y = x 4 y = x 8 3 y = x 4 y = x 3. 4 f(x) = x y = f(x) 4 x =,, 3, 4, 5 5 f(x) f() = f() = 3 f(3) = 3 4 f(4) = 4 *3 S S = f() + f() + f(3) + f(4) () *4

…J…−†[†E…n…‘†[…hfi¯„^‚ΛžfiüŒå

d dt A B C = A B C d dt x = Ax, A 0 B 0 C 0 = mm 0 mm 0 mm AP = PΛ P AP = Λ P A = ΛP P d dt x = P Ax d dt (P x) = Λ(P x) d dt P x =

1. A0 A B A0 A : A1,...,A5 B : B1,...,B

統計学のポイント整理

êUìÆã§ñ¬ÅEÉtÉFÉãÉ~ã§ñ¬.pdf

..3. Ω, Ω F, P Ω, F, P ). ) F a) A, A,..., A i,... F A i F. b) A F A c F c) Ω F. ) A F A P A),. a) 0 P A) b) P Ω) c) [ ] A, A,..., A i,... F i j A i A

1 u t = au (finite difference) u t = au Von Neumann

(1.2) T D = 0 T = D = 30 kn 1.2 (1.4) 2F W = 0 F = W/2 = 300 kn/2 = 150 kn 1.3 (1.9) R = W 1 + W 2 = = 1100 N. (1.9) W 2 b W 1 a = 0

main.dvi

(3) (2),,. ( 20) ( s200103) 0.7 x C,, x 2 + y 2 + ax = 0 a.. D,. D, y C, C (x, y) (y 0) C m. (2) D y = y(x) (x ± y 0), (x, y) D, m, m = 1., D. (x 2 y

y π π O π x 9 s94.5 y dy dx. y = x + 3 y = x logx + 9 s9.6 z z x, z y. z = xy + y 3 z = sinx y 9 s x dx π x cos xdx 9 s93.8 a, fx = e x ax,. a =

untitled

z f(z) f(z) x, y, u, v, r, θ r > 0 z = x + iy, f = u + iv C γ D f(z) f(z) D f(z) f(z) z, Rm z, z 1.1 z = x + iy = re iθ = r (cos θ + i sin θ) z = x iy

1

1.1 1 A


pdf

6

I A A441 : April 21, 2014 Version : Kawahira, Tomoki TA (Kondo, Hirotaka ) Google

III No (i) (ii) (iii) (iv) (v) (vi) x 2 3xy + 2 lim. (x,y) (1,0) x 2 + y 2 lim (x,y) (0,0) lim (x,y) (0,0) lim (x,y) (0,0) 5x 2 y x 2 + y 2. xy x2 + y

II Karel Švadlenka * [1] 1.1* 5 23 m d2 x dt 2 = cdx kx + mg dt. c, g, k, m 1.2* u = au + bv v = cu + dv v u a, b, c, d R

() n C + n C + n C + + n C n n (3) n C + n C + n C 4 + n C + n C 3 + n C 5 + (5) (6 ) n C + nc + 3 nc n nc n (7 ) n C + nc + 3 nc n nc n (

プログラミングD - Java

untitled

,,,17,,, ( ),, E Q [S T F t ] < S t, t [, T ],,,,,,,,

Transcription:

2005 sumii@ecei.tohoku.ac.jp 2005 6 24 ML λ λ 1 λ 1.1 λ λ λ e (λ ) ::= x ( ) λx.e (λ ) e 1 e 2 ( ) ML λx.e Objective Caml fun x -> e x e let 1

let λ 1 let x = e1 in e2 (λx.e 2 )e 1 e 1 x e 2 λ 3 λx.(λy.e) λx.λy.e λx.(e 1 e 2 ) λx.e 1 e 2 λ (e 1 e 2 )e 3 e 1 e 2 e 3 10 3 7 10 (3 7) (10 3) 7 1.2 β λ small-step λ λ λ λx.e 1 e 2 x e 2 e 1 (λx.e 1 )e 2 [e 2 /x]e 1 (R-Beta) λ λ [e 2 /x]e 1 e 1 x e 2 λ 1 β (λx.e 1 )e 2 [e 2 /x]e 1 1 β 1 λ λ λ 2

(λx.x)y y (λx.λy.x)z λy.z (λx.x)(λy.y) λy.y 1. 1 β 1.3 β (λa.b)cd λ (λa.b)cd e e 2 (R-Beta) λ (λa.b)c (R-Beta) (R-Beta) (λa.b)cd Objective Caml (fun a -> b) c d e 1 e 2 e 1 (R-App1) e 1 e 1 e 1 e 2 e 1e 2 (R-App1) λ (λa.b)cd bd 2 (λa.b)cd (λa.b)(cd) ((λa.b)c)d (λa.b)cd = (λa.b)(cd) b 3

(λa.b)c b R-Beta (λa.b)cd bd R-App1 (R-App1) e 1 e 2 e 2 (R- App2) e 2 e 2 e 1 e 2 e 1 e 2 (R-App2) 2. (R-App2) 1. (R-App1) (R-App2) e 1 e 2 e 1 e 2 λ λx.e e (R-Abs) e e λx.e λx.e (R-Abs) ML fun x -> e e (R-Abs) (R-Abs) λx.(λy.y)x λx.x (R-Abs) 1.4 α (λx.λy.xy)y??? (R-Beta) (λx.λy.xy)y λy.yy 4

(λx.λy.xy)y y y λy.yy (λx.λy.xy)y y y y y (λx.λy.xy )y (λx.λy.xy )y λy.yy y λ (λx.λy.xy )y y λy (λx.λy.xy )y y λ λx.xx λy.yy α λ e 1 e 2 α e 1 e 2 α λ λx.y λx.z # let y = (fun a -> fun b -> a) ;; (* y val y : a -> b -> a = <fun> # let z = (fun a -> fun b -> b) ;; (* z val z : a -> b -> b = <fun> 5

# let e1 = (fun x -> y) ;; (* x. y val e1 : a -> b -> c -> b = <fun> # let e2 = (fun x -> z) ;; (* x. z val e2 : a -> b -> c -> c = <fun> # e1 "xxx" "yyy" "zzz" ;; - : string = "yyy" # e2 "xxx" "yyy" "zzz" ;; - : string = "zzz" 2. λ f f(x) = x + 1 g(y) = y + 1 g x, y 1 x2 dx 1 y 2 dy x y α β [e 2 /x]e 1 e 1 e 2 e 1 α e 1 [e 2 /x]y = e 2 (x = y ) y (x y ) [e 2 /x](λy.e) = λy.[e 2 /x]([y /y]e) ( y ) [e 2 /x](ee ) = ([e 2 /x]e)([e 2 /x]e ) 6

1.5 Objective Caml λ Objective Caml type exp = (* Var of string Abs of string * exp (* App of exp * exp (* (* (* let gensym = (* let counter = ref 0 in fun () -> incr counter; (* 0 counter (* () (* counter "g" ^ string_of_int!counter (* g1, g2, g3,... let rec subst e2 x e1 = (* [e2/x]e1 match e1 with Var(y) -> if x = y then e2 else Var(y) Abs(y, e) -> let y = gensym () in Abs(y, subst e2 x (subst (Var(y )) y e)) App(e, e ) -> App(subst e2 x e, subst e2 x e ) let rec step e = (* e e -> e e match e with Var(x) -> [] Abs(x, e0) -> (* (R-Abs) List.map (fun e0 -> Abs(x, e0 )) (step e0) 7

App(e1, e2) -> (* (R-Beta) (match e1 with Abs(x, e0) -> [subst e2 x e0] _ -> []) @ (* (R-App1) List.map (fun e1 -> App(e1, e2)) (step e1) @ (* (R-App2) List.map (fun e2 -> App(e1, e2 )) (step e2) let rec repeat e = (* step match step e with [] -> e e :: _ -> repeat e : # let e1 = Abs("x", Var("x")) ;; (* ( x. x) val e1 : exp = Abs ("x", Var "x") # step e1 ;; - : exp list = [] # let e2 = App(e1, e1) ;; (* ( x. x) ( x. x) val e2 : exp = App (Abs ("x", Var "x"), Abs ("x", Var "x")) # step e2 ;; - : exp list = [Abs ("x", Var "x")] # let e3 = App(e2, e2) ;; (* (( x. x) ( x. x)) (( x. x) ( x. x)) val e3 : exp = App (App (Abs ("x", Var "x"), Abs ("x", Var "x")), App (Abs ("x", Var "x"), Abs ("x", Var "x"))) 8

# step e3 ;; - : exp list = [App (Abs ("x", Var "x"), App (Abs ("x", Var "x"), Abs ("x", Var "x"))); App (App (Abs ("x", Var "x"), Abs ("x", Var "x")), Abs ("x", Var "x"))] # repeat e3 ;; - : exp = Abs ("x", Var "x") 3. step e 2 repeat e 1.6 λ e e e e 0 2 0 λ e 1 e 2 OK 2 λ 1 ( ). λ e e e 1 e e 2 e 1 = e 2 0 e 0 e n e 0 e 1 e 2... e n 1 e n (n 0) e 1, e 2,..., e n 1 e e e 1 e 2 e 2 e 3 e 1 e 3 9

e e e e 2 ( ). λ e e e 1 e e 2 e 1 e e 2 e e 4. 2 1 Ω = (λx.xx)(λx.xx) Ω Ω Ω... (λx.y)ω (λx.y)ω y (λx.y)ω (λx.y)ω (λx.y)ω... λ X X X (λx.y)ω Ω (λx.y)ω λ repeat step e step 5. 10

ML # let rec loop x = loop x ;; (* val loop : a -> b = <fun> # let y = (fun z -> z) ;; (* y val y : a -> a = <fun> # (fun x -> y) (loop ()) ;; Interrupted. λx.y (call-by-value) (call-by-name) Haskell (call-by-need) 1.7 λ λ λ 1.7.1 true, false if e 1 then e 2 else e 3 true = λt.λf.t false = λt.λf.f if e 1 then e 2 else e 3 = e 1 e 2 e 3 if true then e 2 else e 3 = true e 2 e 3 = (λt.λf.t)e 2 e 3 (λf.e 2 )e 3 e 2 11

if false then e 2 else e 3 = false e 2 e 3 = (λt.λf.f)e 2 e 3 (λf.f)e 3 e 3 b if b then e 2 else e 3 b then e 2 else e 3 b true e 2 e 3 e 2 λt.λf.t false e 2 e 3 e 3 λt.λf.f b if b then else 1.7.2 (e 1, e 2 ) = λc.ce 1 e 2 match e 1 with (f, s) -> e 2 = e 1 (λf.λs.e 2 ) c e 1 e 2 λc.ce 1 e 2 (e 1, e 2 ) match 12

6. match (e 1, e 2 ) with (x, y) -> e 3 [e 2 /y][e 1 /x]e 3 1.7.3 0 = λs.λz.z 1 = λs.λz.sz 2 = λs.λz.s(sz) 3 = λs.λz.s(s(sz)). λ (Church encoding) z s 0 z 1 s(z) 2 s(s(z)) 3 s(s(s(z))) s z s z λ 0 = λs.λz.z 1 = λs.λz.sz 2 = λs.λz.s(sz) 3 = λs.λz.s(s(sz)). 13

m + n m + n = λs.λz.ns(msz) msz z s m msz s n m + n s 1 + 2 = λs.λz.1s(2sz) = λs.λz.(λs.λz.sz)s(2sz) λs.λz.(λz.sz)(2sz) λs.λz.s(2sz) = λs.λz.s((λs.λz.s(sz))sz) λs.λz.s((λz.s(sz))z) λs.λz.s(s(sz)) = 3 # let one = Abs("s", Abs("z", App(Var("s"), Var("z")))) ;; val one : exp = Abs ("s", Abs ("z", App (Var "s", Var "z"))) # let two = Abs("s", Abs("z", App(Var("s"), App(Var("s"), Var("z")))));; val two : exp = Abs ("s", Abs ("z", App (Var "s", App (Var "s", Var "z")))) # let plus m n = Abs ("s", Abs ("z", 14

App (App (m, Var("s")), App(App(n, Var("s")), Var("z"))))) ;; val plus : exp -> exp -> exp = <fun> # repeat (plus one two) ;; - : exp = Abs ("s", Abs ("z", App (Var "s", App (Var "s", App (Var "s", Var "z"))))) m n m n = λs.λz.n(λz.msz )z s m n s m n s m λz.msz n n(λz.msz )z z z 7. 1 + 2 3 2 3 6 8. m + n m n λ m n λ m < n m n = 0 1.7.4 g(y) = e fix f = (λx.f(xx))(λx.f(xx)) λ g = fix λg.λy.e 3 3 e g g = λy.e 15

λ f fix f fix f = (λx.f(xx))(λx.f(xx)) f((λx.f(xx))(λx.f(xx))) = f(fix f ) fix f f g(y) g(y) = (fix λg.λy.e )y (λg.λy.e)(fix λg.λy.e )y = (λg.λy.e)gy (λy.e)y e 4 g(y) = e 2 λ λ false 2 false + 2 false + 2 = (λt.λf.f) + 2 = (λs.λz.z) + 2 = 0 + 2 2 4 g g = fix λg.λy.e g λ fix λg.λy.e α fix λg.λy.[g /g]e 16

λ if 3 + 7 then 10 else false λ 2.1 τ τ ( ) ::= b ( ) τ 1 τ 2 ( ) bool nat τ ( ) ::= τ 1 τ 2 ( ) τ 2.2 τ e τ λx.x x x τ τ λx.x τ τ λx.x : τ τ e τ 17

e : τ λx.y y y τ λx.y τ τ y : τ λx.y : τ τ x 1, x 2,..., x n τ 1, τ 2,..., τ n e τ x 1 : τ 1, x 2 : τ 2,..., x n : τ n e : τ m : nat, n : nat, plus : nat nat nat plus m n : nat nat nat nat nat (nat nat) x 1 : τ 1, x 2 : τ 2,..., x n : τ n Γ x 1, x 2,..., x n τ 1, τ 2,..., τ n 2.3 Γ, e, τ Γ e : τ 18

λ Γ(x) = τ Γ x : τ (T-Var) Γ, x : τ 1 e : τ 2 Γ λx.e : τ 1 τ 2 Γ e 1 : τ τ Γ e 2 : τ Γ e 1 e 2 : τ (T-Abs) (T-App) (T-Var) Γ x : τ Γ x τ (T-App) Γ e 1 τ τ e 2 τ e 1 e 2 τ (T-Abs) Γ λx.e τ 1 τ 2 Γ x : τ 1 Γ, x : τ 1 e τ 2 x τ 1 e τ 2 : s : nat nat, z : nat s : nat nat T-Var s : nat nat, z : nat z : nat T-Var s : nat nat, z : nat sz : nat s : nat nat λz.sz : nat nat λs.λz.sz : (nat nat) nat nat T-App T-Abs T-Abs 2.4 false + 5 if 3 + 7 then 10 else false λ λ λ 19

λ λ = v ( ) ::= λx.e ( ) λ 3 ( ). e : τ e e e 1 ( ). e : τ e e e e 2 ( ). e : τ e e e : τ e : τ 3 ( ). Γ e 1 : τ 1 Γ, x : τ 1 e 2 : τ 2 Γ [e 1 /x]e 2 : τ 2. Γ, x : τ 1 e 2 : τ 2 9. 1 2 3 2.5 1.7.1 true = λt.λf.t false = λt.λf.f if e 1 then e 2 else e 3 = e 1 e 2 e 3 20

λ true = λf.λt.t false = λf.λt.f if e 1 then e 2 else e 3 = e 1 e 3 e 2 true false true : bool, false : bool, if : bool nat nat nat e : nat true, false, if λ e [λt.λf.t/true][λt.λf.f/false][λb.λt.λf.btf/if]e 1 [λf.λt.t/true][λf.λt.f/false][λb.λt.λf.bf t/if]e 2 e true 2 e (T-App) Objective Caml # let ht = Hashtbl.create 10 ;; (* ht val ht : ( _a, _b) Hashtbl.t = <abstr> # ht ;; (* ht - : (string, int) Hashtbl.t = <abstr> 21

# Hashtbl.add ht "abc" 123 ;; (* "abc" 123 ht - : unit = () # Hashtbl.add ht "de" 456 ;; (* "de" 456 - : unit = () # Hashtbl.add ht "f" 789 ;; (* "f" 789 - : unit = () # Hashtbl.find ht "de" ;; (* "de" - : int = 456 # Hashtbl.find ht "g" ;; (* "g" Exception: Not_found. # ht + 1 ;; (* Hashtbl ht Characters 0-2: ht + 1 ;; (* Hashtbl ht ^^ This expression has type (string, int) Hashtbl.t but is here used with type int λ 9,,, ISBN 4-320-02659-4. 5 Types and Programming Languages. Benjamin C. Pierce. The MIT Press. ISBN 0-262-16209-1. 5 22