if n % 15 = 0 then println_str "fizzbuzz" else if n % 3 = 0 then println_str "fizz" else if n % 5 = 0 then println_str "buzz" else println_int n in let rec go n = if n = max then () else (fb n; go (n+1)) in go 1 in let max = 100 in fizzbuzz max ؔఆٛࣜ MFUSFDGYFJOF ωετͨؔ͠ఆٛ ϧʔϓແ͍ͷͰ࠶ ؼؔΛ͏ ݅ذͷJGࣜ JGFUIFOFFMTFF ؔݺͼग़͠ GFFʜ มఆٛ MFUYFJOF ͦͷଞɼྻɼλϓϧɼ PQUJPOܕͳͲʜ Ϋϩʔδϟ
*) let rec id x = x in (* 'a ʹ int ΛೖΕΔ *) print_int (id 10); (* 'a ʹ bool ΛೖΕΔ *) print_bool (id false); (* ܕ 'a option *) let o = None in (* 'a ʹ int ΛೖΕΔ *) match o with Some(i) -> print_int i | None -> (); (* 'a ʹ bool ΛೖΕΔ *) match o with Some(b) -> print_bool b | None -> (); ͭͷ͕ෳͷܕΛ࣋ͯΔΑ͏ʹͳΔ bBbB ˣ JOUJOU CPPMCPPM ʜ
f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () NBLF@QBJSҾΛYΛͱΓɼʮҾ ZΛऔͬͯYͱZͷϖΞΛฦ͢ ؔʯΛฦ͢ YΛΩϟϓνϟͨ͠ΫϩʔδϟΛͭ ͘ΓɼͦΕΛฦ͢ NBLF@QBJSΛճผͷܕͷҾͰݺͼ ग़ͯ͠ΈΔ
Ϩϕϧ n ͷܕมɽ ·ͩܕ͕֬ఆ͍ͯ͠ͳ͍ ʢະଋറʣ • ‘a: ଋറࡁΈͷܕมʢ ҙͷܕ͕ೖΕΔʣ let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in ()
f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM $VSSFOU-FWFM ࠷ॳϨϕϧ͔Βελʔτ
?a(1) let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM $VSSFOU-FWFM MFUࣜͰ৽͍͠ม͕ಋೖ͞ΕΔͱɼଋറ ͞ΕΔࣜͷதͰϨϕϧ্͕͕Δ ͜ͷ࣌ͰNBLF@QBJSҾͷؔ ͱ͍͏͜ͱ͔͔͠Βͳ͍
?a(1) • f: ?c(2) -> ?d(2) • y: ?c(2) let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM
?a(1) • f: ?c(2) -> ?a(1) * ?c(2) • y: ?c(2) let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM ࣜ Y Z ͔ΒΓYͱZͷλϓϧ ͩͱ͔Δˠ E B D ʢ୯ҰԽʣ
?a(1) • f: ‘c -> ?a(1) * 'c • y: 'c let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM MFUࣜʹଋറ͞Ε͍ͯΔࣜͷܕਪ͕ऴ Θͬͨ࣌ʹɼରͷมͷܕΛ൚Խ͢Δ Gҙͷܕ D ͷҾΛͭऔΓɼͦ ͷܕͷͱະͷܕͷͷϖΞʢ B bDʣΛฦ͢
* 'c) • x: ?a(1) • f: 'c -> ?a(1) * 'c • y: 'c let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM ࣜG͔ΒNBLF@QBJSͷΓͷܕG ͱಉ͡ܕͩͱ͔Δ C bD B bD ʢ୯ҰԽʣ
* 'c) • x: 'a • f: 'c -> 'a * 'c • y: 'c let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM NBLF@QBJSͷܕΛ൚Խ͢ΔɽҰ൪֎ଆ ͷMFUSFDࣜͷϨϕϧͳͷͰશͯ ͷະ֬ఆͳܕมΛଟ૬ܕʹ֬ఆ͢Δ
ΛҾʹͨ͠ݺ ͼग़͠Ͱ int -> int ʹͳΔɽ 3ߦͰม id ͷࢀরͷܕ ?c -> ?cɼbool ΛҾʹͨ͠ݺ ͼग़͠Ͱ bool -> bool ʹͳΔɽ let rec id x = x in (* 'a -> 'a *) id 10; (* int -> int *) id true; (* bool -> bool *)
* 'c) • x: 'a • f: 'c -> 'a * 'c • y: 'c • pair: 'f -> int * ‘f let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM F G F G bB bDbB bD ΛΠϯελϯεԽ ҾJOUͳͷͰ F JOU ͰɼΓܕ͔ΒQBJSͷܕ G JOU G ɽ͜Ε Λ൚Խ
* 'c) • x: 'a • f: 'c -> 'a * 'c • y: 'c • pair: 'f -> int * ‘f • p: int * bool let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM H JOU H bGJOU bGΛΠϯελϯεԽ ҾCPPMͳͷͰ F CPPMͰɼΓܕ͔ΒQͷܕ JOU CPPMɽࠓճະ֬ఆͷ ܕม͕ແ͍ͷͰ൚Խෆཁ
* 'c) • x: 'a • f: 'c -> 'a * 'c • y: 'c • pair: 'f -> int * ‘f • p: int * bool • pair2: ‘i -> float * ‘i let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM I J I J ಉ༷ʹbB bDbB bD ΛΠϯελϯεԽ ͭͷNBLF@QBJSݺͼ ग़͔͠Β
* 'c) • x: 'a • f: 'c -> 'a * 'c • y: 'c • pair: 'f -> int * ‘f • p: int * bool • pair2: ‘i -> float * ‘i • p: float * string let rec make_pair x = let rec f y = (x, y) in f in let pair = make_pair 42 in let p = pair true in let pair2= make_pair 3.0 in let p = pair2 "aaa" in () MFWFM MFWFM MFWFM $VSSFOU-FWFM K qPBU K bGJOU bGΛΠϯελϯεԽ QBJSݺͼग़͔͠Β
ͦͷ··ɼͦΕҎ֎ͷώʔϓͳͲʹͱͬͯϙΠϯλͰѻ͏ • ਖ਼֬ͳ GC ͷͨΊɼϙΠϯλ͔ͦ͏Ͱͳ͍͔அ͢ΔͷʹԼҐ̍ϏοτʹλάΛೖΕΔ ඞཁ͕͋Δ • ଟ૬ͳ͕औΔܕ͝ͱʹίʔυΛෳ͢Δʢmlton, Crystal, C++ (, Rust) ͳͲʣ • i.e. id: ‘a -> ‘a ͕ int -> int ͰΠϯελϯεԽ͞Ε͍ͯΔͳΒ id_int: int -> int Λੜ • ࣮ߦ࣌ͷΦʔόʔϔουগͳ͍͕ίʔυαΠζ͕രൃ͠͏ΔɽׂίϯύΠϧ͕͍͠ • ܕΫϥεΛఆٛ͠ɼܕΫϥε͝ͱͷ࣮ΛؔͷࣙॻͰ͢ʢHaskell (,Rust) ͳͲʣ • ࣙॻ͔Βݺͼग़ؔ͢ΛҾ͍ͯ͘ΔΦʔόʔϔου͕͋Δ͕ɼ͍ؔΠϯϥΠϯԽʹ ΑΓίʔυෳͱಉ͡ޮՌ͕ظͰ͖Δ
in let f = id in id 10; id "foo"; f 3.0; f true; let rec id_int x = x in let rec id_string x = x in let rec id_float x = x in let rec id_bool x = x in let f_float = id_float in let f_bool = id_bool in id_int 10; id_string "foo"; f_float 3.0; f_bool true;