Download - Ocaml くんと 友達になろう!
![Page 1: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/1.jpg)
わんくま同盟 名古屋勉強会 #5
Ocaml くんと友達になろう!
花子
![Page 2: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/2.jpg)
わんくま同盟 名古屋勉強会 #5
Agenda
• 出会いは・・・• どんな子?• まずは挨拶• 話しかけてみよー• 名前を覚えてもらっちゃお!• 嫌われないようにしなくっちゃ!• 遊んでみよー• 友達になれそうですか?
![Page 3: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/3.jpg)
わんくま同盟 名古屋勉強会 #5
Agenda
Ocaml くんのらぶらぶポイントを説明しつつ
Ocaml くんとの距離を縮めていきたいと思います。
![Page 4: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/4.jpg)
わんくま同盟 名古屋勉強会 #5
出会いは・・・
2008/8/9 の OSC 名古屋で聞いた
OCaml-Nagoya のセッションでした。
・名古屋で活動している OCaml の勉強会グループ ・隔週で勉強会を開催 ・ 2007/05 に解説本を出版
![Page 5: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/5.jpg)
わんくま同盟 名古屋勉強会 #5
どんな子?
まずは、ちょっぴり予備知識を仕入れてみま
す。
知らない人にいきなり話しかけられない
小心者なので・・・
![Page 6: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/6.jpg)
わんくま同盟 名古屋勉強会 #5
どんな子?
名前は・・・ OCaml で、略さないと Objective
Caml
読み方は、キャムルとか、キャメルとか
![Page 7: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/7.jpg)
わんくま同盟 名古屋勉強会 #5
どんな子?
属性は・・・ 関数型プログラミング言語 型推論を持つ静的型付け言語
![Page 8: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/8.jpg)
わんくま同盟 名古屋勉強会 #5
どんな子?
生まれは・・・ おフランスの国立 INRIA 研
究所
![Page 9: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/9.jpg)
わんくま同盟 名古屋勉強会 #5
どんな子?
1970 年代ML ( Meta Language )
Caml
OCaml
+ オブジェクト指向機能
最新は・・・ OCaml 3.10.2
1986 年
1996 年
家系図は・・・
![Page 10: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/10.jpg)
わんくま同盟 名古屋勉強会 #5
まずは挨拶
といっても、デモはしなくって・・・実行画面を書き写してきました(^^)v
コンパイルもできますが、とりあえずインタープリタで
![Page 11: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/11.jpg)
わんくま同盟 名古屋勉強会 #5
まずは挨拶
Hello OCaml くん - : unit = ()
# print_string "Hello OCaml くん ";;
![Page 12: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/12.jpg)
わんくま同盟 名古屋勉強会 #5
話しかけてみよー
# 1 + 2;;
- : int = 3
# 0.1 +. 0.2;;
- : float = 0.30000000000000004
らぶらぶ
ポイント
型推論
![Page 13: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/13.jpg)
わんくま同盟 名古屋勉強会 #5
話しかけてみよー
# 1 + 0.1;;
Characters 4-7: 1 + 0.1;; ^^^This expression has type float but is here used with type int
![Page 14: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/14.jpg)
わんくま同盟 名古屋勉強会 #5
名前を覚えてもらっちゃお!
# let x = 1;;
val x : int = 1
# x + 2;;
- : int = 3
![Page 15: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/15.jpg)
わんくま同盟 名古屋勉強会 #5
名前を覚えてもらっちゃお!
変数 x
手続型
定数1
OCaml
定数1
変数 x
1 を x に束縛する
![Page 16: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/16.jpg)
わんくま同盟 名古屋勉強会 #5
名前を覚えてもらっちゃお!
代入もできない
# let x;;
Characters 5-7:let x;; ^^Syntax error
らぶらぶ
ポイント
必ず初期化が必要なので初期化漏れがない
![Page 17: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/17.jpg)
わんくま同盟 名古屋勉強会 #5
嫌われないようにしなくっちゃ!
参照型を使うと・・・
# let a = ref 1;;
val a : int ref = {contents = 1}
# a := 1 + 2 ;;
- : unit = ()
# !a;;
- : int = 3
副作用 a の状態が変わる 参照型、 for 文
![Page 18: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/18.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
# let aaa = fun x -> x + 1;;
val aaa : int -> int = <fun>
# aaa 3;;
- : int = 4
# aaa 0.1;;
Characters 4-7: aaa 0.1;; ^^^This expression has type floatbut is here used with type int
1 加算する関数を作ってみる
# let aaa x = x + 1;;
![Page 19: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/19.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよーリストの長さを数える関数を作ってみる# let aaa list = match list with [] -> 0 | [a] -> 1 | [a;b] -> 2 | _ -> 3;;
らぶらぶ
ポイント
便利なパターンマッチングパターンの漏れも警告(右辺の型を揃える)
val aaa : 'a list -> int = <fun>
多相型が簡単に作れるらぶら
ぶポイン
ト
![Page 20: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/20.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
# aaa [];;
- : int = 0
# aaa [“abc"];;
- : int = 1
# aaa [1; 2];;
- : int = 2
# aaa [0.1; 0.2; 0.3; 0.4];;
- : int = 3
# let aaa = function [] -> 0 | [a] -> 1 | [a;b] -> 2 | _ -> 3;;
![Page 21: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/21.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
リストの要素を加算する関数を作ってみる
# let sum = function [] -> 0 | [a] -> a | [a;b] -> a + b | _ -> 100;;
val sum : int list -> int = <fun>
# sum [2; 3];;- : int = 5
# sum [1; 0.2];;
Characters 8-11: sum [1; 0.2];; ^^^This expression has type float but is here used with type int
![Page 22: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/22.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー再帰関数を使ってリストの全要素を加算する関数を作ってみる
# let rec sum = function [] -> 0 | hd::tl -> hd + sum tl;;
val sum : int list -> int = <fun>
# sum [1; 2; 3; 4; 5];;
- : int = 15
![Page 23: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/23.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
# let rec sum = function [] -> 0 | hd::tl -> hd + sum tl;;
# sum [1; 2; 3];;
1 + sum [2; 3]
2 + sum [3]
3 + sum []
0
- : int = 6
1 + 5
2 + 3
3 + 0
![Page 24: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/24.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
ちょっと作り変えて
# let rec sum ans = function [] -> ans | hd::tl -> sum (ans + hd) tl;;
val sum : int list -> int = <fun>
# sum 0 [1; 2; 3; 4; 5];;
- : int = 15
![Page 25: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/25.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
# let rec sum ans = function [] -> ans | hd::tl -> sum (ans + hd) tl;;
# sum 0 [1; 2; 3];;
sum (0 + 1) [2; 3]
sum (1 + 2) [3]
sum (3 + 3) []
- : int = 6
末尾再帰関数スタックを使用しないように最適化
らぶらぶ
ポイント
![Page 26: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/26.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
末尾再帰関数とは・・・ 再帰呼び出しを右辺でのみ行う 再帰関数の戻り値に計算を行わない
# let rec sum ans = function [] -> ans | hd::tl -> sum (ans + hd) tl;;
# let rec sum = function [] -> 0 | hd :: tl -> hd + sum tl;;
![Page 27: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/27.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
固定値の引数 0 をなくしてみる
# let sum list = let rec loop ans = function [] -> ans | hd::tl -> loop (hd + ans) tl in loop 0 list;;
val sum : int list -> int = <fun>
# sum [1; 2; 3; 4; 5];;- : int = 15
関数内関数が使える
らぶらぶ
ポイント
![Page 28: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/28.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
高階関数を使ってみる
# let rec fold_left ff init = function [] -> init | hd::tl -> fold_left ff (ff init hd) tl;;
val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
# fold_left (+) 0 [1; 2; 3; 4; 5];;- : int = 15
# fold_left (+.) 0.0 [0.1; 0.2; 0.3; 0.4; 0.5];;- : float = 1.5
![Page 29: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/29.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
# let rec fold_left ff init = function [] -> init | hd::tl -> fold_left ff (ff init hd) tl;;
# let sum list = fold_left (+) 0 list;;val sum : int list -> int = <fun>
# sum [1; 2; 3; 4; 5];;- : int = 15
便利な高階関数が簡単に作れる再帰関数なしでリスト処理ができる
らぶらぶ
ポイント
![Page 30: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/30.jpg)
わんくま同盟 名古屋勉強会 #5
遊んでみよー
標準ライブラリには、map 、 fold_left など便利な機能がいっぱい
# let sum list = List.fold_left (+) 0 list;;
val sum : int list -> int = <fun>
らぶらぶ
ポイント
![Page 31: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/31.jpg)
わんくま同盟 名古屋勉強会 #5
友達になれそうですか?
関数型っぽい特長をいくつか説明しましたが、まだまだ他にも らぶらぶポイント はいっぱいあります。
![Page 32: Ocaml くんと 友達になろう!](https://reader036.vdocuments.site/reader036/viewer/2022081419/568151a6550346895dbfd6e0/html5/thumbnails/32.jpg)
わんくま同盟 名古屋勉強会 #5
友達になれそうですか?
おもしろそうだなーと思ってもらえたら、フリーでダウンロードできますので、ぜひぜひ遊んでみてください。
http://caml.inria.fr/download.en.html
ありがとうございました m(_’_)m