メイキング オブ 関数型プログラミングマンガ -...
TRANSCRIPT
![Page 1: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/1.jpg)
メイキングオブ
関数型プログラミングマンガ
esehara shigeo
![Page 2: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/2.jpg)
謝罪
![Page 3: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/3.jpg)
サンプルコード全く書けませんでした
![Page 4: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/4.jpg)
圧倒的土下座
![Page 5: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/5.jpg)
気をとりなおして
![Page 6: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/6.jpg)
お前誰だ
![Page 7: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/7.jpg)
esehara shigeo (31)twitter: @esehara
Logbar Inc.Clojuren
最近の趣味: OCaml
![Page 8: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/8.jpg)
現在の画力
『マンガでわか『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってないマンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってないる!関数『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない型プログラミング』やめてほしいとしか思ってない
![Page 9: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/9.jpg)
一応、こういう地道な練習はしているんですよ……
![Page 10: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/10.jpg)
圧倒的現実
![Page 11: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/11.jpg)
進捗
![Page 12: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/12.jpg)
現段階でボツネーム4回目
![Page 13: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/13.jpg)
![Page 14: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/14.jpg)
人間がゾンビ化した世界
![Page 15: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/15.jpg)
![Page 16: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/16.jpg)
ネオナゴヤで「食料」を奪取する為の関数型プログラミング…
![Page 17: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/17.jpg)
締め切りまで
あと11日
![Page 18: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/18.jpg)
無事、彼は原稿を届けることが出来るのだろうか
![Page 19: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/19.jpg)
続報を待て
![Page 20: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/20.jpg)
結論:
マンガを書くのは難しい
![Page 21: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/21.jpg)
宣伝終了
![Page 22: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/22.jpg)
![Page 23: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/23.jpg)
最高のIoTデバイス買ってください!!
![Page 24: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/24.jpg)
宣伝終了
![Page 25: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/25.jpg)
ところで何処が「関数型
プログラミング」なんですか
![Page 26: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/26.jpg)
本題
![Page 27: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/27.jpg)
なぜ関数型プログラミングを
「説明」することが難しいのか
esehara shigeo
![Page 28: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/28.jpg)
![Page 29: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/29.jpg)
![Page 30: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/30.jpg)
問題
![Page 31: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/31.jpg)
そもそも「関数型プログラミング」と定義される場合の「関数型」の特徴とは?
![Page 32: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/32.jpg)
関数型プログラミングの特徴は「関数を第一級の対象(first class-object)である」、つまり関数を引数にしたり、関数を結果の値とするようなもの。(by 『関数型プログラミング』R.ロバート/P.ワドラーより)
現状、PythonやJavaScriptは「関数を第一級の対象」にできるといえるわけだから、ちょっとこれでは説明が足りない
![Page 33: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/33.jpg)
関数型プログラミングは、コマン
ドの実行を強調するプログラミン
グスタイルではなく、式の評価を
強調します。これらの言語での式
(expression)は、基本的な値を
結合するための関数を用いて形
成されています。関数型言語ファ
ンクショナルなスタイルでプログ
ラミングを推奨し、サポートする
言語です。
Functional programming is a style of programming that emphasizes the evaluation of expressions, rather than execution of commands. The expressions in these language are formed by using functions to combine basic values. A functional language is a language that supports and encourages programming in a functional style.
![Page 34: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/34.jpg)
代入を使わないうちは, 同じ引数での同じ手続きの二回の評価は同じ結果を生じ,手続きは数学的関数を計算すると見ることが出来た. 本書の初めの二章でやったように, 代入を使わないプログラミングは, 従って 関数型プログラミング(functional programming)という.
(by SICP)
![Page 35: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/35.jpg)
「副作用をできるだけ(あるいは全く)用いず、式や関数で計算を表すプログラミングスタイルのことです。」
(by Eijiro Sumii)
![Page 36: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/36.jpg)
筆者の関数プログラミングの定義,すなわちこの特集での定義
は,「永続データプログラミング」です。永続データとは,破壊でき
ないデータ,つまり再代入できないデータのことです。そして,永
続データを駆使して問題を解くのが永続データプログラミングで
す。
また関数型言語とは,永続データプログラミングを奨励し支援し
ている言語のことです。関数型言語では,再代入の機能がない
か,再代入の使用は限定されています。筆者の定義はかなり厳
しいほうだと言えます。(by 山本和彦)
![Page 37: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/37.jpg)
死ぬほど定義出てくる
時点でムズい!!
![Page 38: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/38.jpg)
強引なまとめ
● 関数を第一級オブジェクト(=値と同一)のものとして取り扱う(これはそうではない言語もあるので怪しい?)
● 副作用をできるだけ使わず、式や関数で表現する
● イミュータブルな(不変のデータ構造)を重要視する
![Page 39: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/39.jpg)
蛇足
![Page 40: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/40.jpg)
![Page 41: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/41.jpg)
最近の本(『実践関数プログラミング』)だと、いわゆる「Lisp」(正確にはCommon Lisp、Scheme)という理由だけで関数型言語の仲間には入れない感じ(Lispは”Lisp”というパラタイム)Common Lispはバリバリ、データ構造を変更しまくる。ただ、Clojureは不変のデータ構造を意識させるために仲間にされることはある(いちおう、Racket langという処理系も、明示的にデータをImmutableにすることは可能)
![Page 42: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/42.jpg)
歴史
![Page 43: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/43.jpg)
「オブジェクト指向」vs
「関数型プログラミング」
![Page 44: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/44.jpg)
「オブジェクト指向」vs
「関数型プログラミング」
![Page 45: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/45.jpg)
![Page 46: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/46.jpg)
![Page 47: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/47.jpg)
前段階としての構造化
プログラミング
![Page 48: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/48.jpg)
「順次、分岐、反復」の三種の神器
![Page 49: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/49.jpg)
top-down program development
+stepwise refinement
![Page 50: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/50.jpg)
批判
![Page 51: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/51.jpg)
構造化プログラミングは制御の流れしか捉えられておらん
![Page 52: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/52.jpg)
そもそも計算のパターンと
状態の変化そのものを対応するのは
難しいやろが
![Page 53: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/53.jpg)
代入
![Page 54: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/54.jpg)
そもそも変化とは何か
(哲学)
![Page 55: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/55.jpg)
参照透明性を一旦捨てると, 計算オブジェクトが「同じ」であるとは何を意味するかの概念を形式的に捕らえるのは難しくなる. 実はわれわれのプログラムがモデル化している実世界の「同じ」の意味もあまりはっきりしない. 一般に二つの見かけ上同じなオブジェクトが本当に「同じもの」であるかは, 一つのオブジェクトを変えてみて, もう一つのオブジェクトが同じように変っているかを見て決める. しかし「同じ」オブジェクトを二度観測し, オブジェクトのある性質が一回目と二回目の観測で違っているということ以外に, あるオブジェクトが「変った」ことがどうして分るだろうか. つまり何か先験的な 「同一」という概念なしに「変化」を決めることは出来ず, 変化の効果を観測することなしに同一性を決めることは出来ない.(SICPより)
![Page 56: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/56.jpg)
手続き型プログラムを学ぶ際の障壁の一つが代入(assignment)の概念であることは随所で指摘されている。これは計算過程と計算状態という考え方が初心者にとっては新奇なものでなじめないということにも理由があろう。
![Page 57: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/57.jpg)
多くのプログラミング学習者が理解に苦しむ問題を調査した所、以
下のような結果が得られた。
●代入とシーケンス実行
●再帰と繰り返し実行
●並列実行
再帰やループはたしかに難しい。並列実行はとても難しいが、多く
の挫折者はそこまで到達しない。しかし、代入とシーケンス実行とい
う、プログラミングの最も基本的である概念の理解に苦しむとはどう
いうことか。 (60%の人間はプログラミングの素質がない - 本の虫)
![Page 58: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/58.jpg)
破壊的代入は強すぎる
![Page 59: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/59.jpg)
強すぎる=
ハイリスクハイリターン
![Page 60: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/60.jpg)
逆に関数型プログラミングの
理解のしにくさは何処にある
![Page 61: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/61.jpg)
調査
![Page 62: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/62.jpg)
![Page 63: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/63.jpg)
大体こんな感じ?● インターネットがまだ無い時代に図書館で読み漁った本で、
まず、関数っていう物の意味が分からなかったんですよね。
● 「実行順序の無いプログラム」というのがよく分かりません。
「SQLもループ処理の一部を書いているだけだ」と理解して
いる私にとっては、ループを使わずにプログラムを書くという
ことが既に分かりません。
● 競技プログラミングの問題をたまに解いたりする程度です
が、最初は変数が書き換えられないということに大きな衝撃
を受けました。
![Page 64: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/64.jpg)
大体こんな感じ?● インターネットがまだ無い時代に図書館で読み漁った本で、
まず、関数っていう物の意味が分からなかったんですよね。
● 「実行順序の無いプログラム」というのがよく分かりません。
「SQLもループ処理の一部を書いているだけだ」と理解して
いる私にとっては、ループを使わずにプログラムを書くという
ことが既に分かりません。
● 競技プログラミングの問題をたまに解いたりする程度です
が、最初は変数が書き換えられないということに大きな衝撃
を受けました。
![Page 65: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/65.jpg)
多くのプログラミング学習者が理解に苦しむ問題を調査した所、以
下のような結果が得られた。
●代入とシーケンス実行
●再帰と繰り返し実行
●並列実行
再帰やループはたしかに難しい。並列実行はとても難しいが、多く
の挫折者はそこまで到達しない。しかし、代入とシーケンス実行とい
う、プログラミングの最も基本的である概念の理解に苦しむとはどう
いうことか。 (60%の人間はプログラミングの素質がない - 本の虫)
![Page 66: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/66.jpg)
再帰関数副作用
![Page 67: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/67.jpg)
関数
![Page 68: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/68.jpg)
関数型プログラミングにおける関数とは「与えられた入力の値のみから出力となる値をただ1つ決める規則」という数学的な意味での関数です(『実践関数プログラミング入
門』)
![Page 69: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/69.jpg)
![Page 70: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/70.jpg)
![Page 71: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/71.jpg)
ちょっとまてや
![Page 72: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/72.jpg)
![Page 73: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/73.jpg)
プログラミングの用語として、関数のような「(類似の)一連の処理をまとめた単位」をサブルーチン(subroutine)、もしくは手続き(procedure)とも呼ぶ.これらの概念の境界は必ずしも明確ではないが、手続きは処理だけを行い返り値を持たないもの、関数は返り値があるもの、と区別される傾向がある。
![Page 74: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/74.jpg)
問題は値を得ること
![Page 75: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/75.jpg)
テストが素早く済めば,もっと頻繁にテストができる. Lispでは(他のどのプログラミング言語でもそうだが),ソフトウェア開発はコード書きとテストのサイクルから成る. しかしLispではサイクルがとても短い: 関数1個毎,いや関数の部分毎でもいい. あらゆる部分を書くにつれてテストすれば, エラーが起きたときにどこを見ればいいか分かるだろう: 最後に書いた部分だ.単純に聞こえるが,この原則はボトムアップ・プログラミングを堅固なものにしている要因の 大きな割合を占めている.それは更なる自信をもたらし,Lispプログラマは(少なくともある一時) 古い「計画−実装」スタイルのソフトウェア開発からフリーになれるのだ.(『On Lisp』より)
![Page 76: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/76.jpg)
問題は、このようなボトムアップなコーディングにあまり慣れない
![Page 77: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/77.jpg)
部分を寄せ合わせるという発想
![Page 78: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/78.jpg)
再帰
![Page 79: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/79.jpg)
![Page 80: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/80.jpg)
再帰は数学から生まれた有用な技法である。再帰コードは一般に、反復コードよりも短くて書きやすい。
![Page 81: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/81.jpg)
ちょっとまてや
![Page 82: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/82.jpg)
whileにおける反復のポイント
● 変数を初期化● 条件を満たしているならwhileのブロックの最初に戻る
● 変数に新しい値を代入する
![Page 83: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/83.jpg)
PythonにおけるWhile
a = 0
while a < 100: a += 1 print(a)
![Page 84: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/84.jpg)
あれ?ブロックを関数でまとめちゃえば
いいんじゃないの?
![Page 85: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/85.jpg)
再帰からわかること
● 「ブロック」としてまとめることができる、ということはその「ブロック」自体を関数にすることが可能である
![Page 86: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/86.jpg)
Schemeにおける再帰
(define (ref-loop i j) (if (<= i j)
(begin(print i) (ref-loop (+ i 1)j))))
(ref-loop 1 100)
![Page 87: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/87.jpg)
ソフトウェア開発はコード書きとテストのサイクルから成る.しかしLispではサイクルがとても短い: 関数1個毎,いや関数の部分毎でもいい.
![Page 88: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/88.jpg)
一気にロジックを書き上げようとすると死ぬ
![Page 89: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/89.jpg)
部分を寄せ合わせるときに
型チェックがあると便利(テストのサイクルに
組み込まれる)
![Page 90: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/90.jpg)
注意
![Page 91: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/91.jpg)
再帰は強すぎる
![Page 92: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/92.jpg)
だいたいの再帰を利用したループは
mapなどの高階関数で表現することが可能
![Page 93: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/93.jpg)
結論
![Page 94: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/94.jpg)
なぜ関数型プログラミングを
「説明」することが難しいのか
![Page 95: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/95.jpg)
トップレベルで書き下すことからボトムアップで
繋ぎ合わせていくという発想の転換が難しい
![Page 96: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/96.jpg)
ブロックで処理を数十行書くのではなく
細かく関数を切り分けて作り上げて繋げるというのが難しい
![Page 97: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/97.jpg)
逆に代入による計算過程と計算状態という考え方に慣れすぎているために難しい。
![Page 98: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015](https://reader034.vdocuments.site/reader034/viewer/2022050614/58a62b411a28ab416c8b5f87/html5/thumbnails/98.jpg)
泥団子のように関数を小さく始めてみよう