メイキング オブ 関数型プログラミングマンガ -...

98
メイキング オブ 関数型プログラミング マンガ esehara shigeo

Upload: esehara-shigeo

Post on 12-Apr-2017

1.352 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

メイキングオブ

関数型プログラミングマンガ

esehara shigeo

Page 2: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

謝罪

Page 3: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

サンプルコード全く書けませんでした

Page 4: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

圧倒的土下座

Page 5: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

気をとりなおして

Page 6: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

お前誰だ

Page 7: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

esehara shigeo (31)twitter: @esehara

Logbar Inc.Clojuren

最近の趣味: OCaml

Page 8: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

現在の画力

『マンガでわか『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってないマンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってないる!関数『マンガでわかる!関数型プログラミング』やめてほしいとしか思ってない型プログラミング』やめてほしいとしか思ってない

Page 9: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

一応、こういう地道な練習はしているんですよ……

Page 10: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

圧倒的現実

Page 11: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

進捗

Page 12: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

現段階でボツネーム4回目

Page 13: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 14: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

人間がゾンビ化した世界

Page 15: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 16: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ネオナゴヤで「食料」を奪取する為の関数型プログラミング…

Page 17: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

締め切りまで

あと11日

Page 18: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

無事、彼は原稿を届けることが出来るのだろうか

Page 19: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

続報を待て

Page 20: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

結論:

マンガを書くのは難しい

Page 21: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

宣伝終了

Page 22: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 23: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

最高のIoTデバイス買ってください!!

Page 24: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

宣伝終了

Page 25: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ところで何処が「関数型

プログラミング」なんですか

Page 26: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

本題

Page 27: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

なぜ関数型プログラミングを

「説明」することが難しいのか

esehara shigeo

Page 28: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 29: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 30: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

問題

Page 31: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

そもそも「関数型プログラミング」と定義される場合の「関数型」の特徴とは?

Page 32: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

関数型プログラミングの特徴は「関数を第一級の対象(first class-object)である」、つまり関数を引数にしたり、関数を結果の値とするようなもの。(by 『関数型プログラミング』R.ロバート/P.ワドラーより)

現状、PythonやJavaScriptは「関数を第一級の対象」にできるといえるわけだから、ちょっとこれでは説明が足りない

Page 33: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

関数型プログラミングは、コマン

ドの実行を強調するプログラミン

グスタイルではなく、式の評価を

強調します。これらの言語での式

(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

代入を使わないうちは, 同じ引数での同じ手続きの二回の評価は同じ結果を生じ,手続きは数学的関数を計算すると見ることが出来た. 本書の初めの二章でやったように, 代入を使わないプログラミングは, 従って 関数型プログラミング(functional programming)という.

(by SICP)

Page 36: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

筆者の関数プログラミングの定義,すなわちこの特集での定義

は,「永続データプログラミング」です。永続データとは,破壊でき

ないデータ,つまり再代入できないデータのことです。そして,永

続データを駆使して問題を解くのが永続データプログラミングで

す。

また関数型言語とは,永続データプログラミングを奨励し支援し

ている言語のことです。関数型言語では,再代入の機能がない

か,再代入の使用は限定されています。筆者の定義はかなり厳

しいほうだと言えます。(by 山本和彦)

Page 37: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

死ぬほど定義出てくる

時点でムズい!!

Page 38: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

強引なまとめ

● 関数を第一級オブジェクト(=値と同一)のものとして取り扱う(これはそうではない言語もあるので怪しい?)

● 副作用をできるだけ使わず、式や関数で表現する

● イミュータブルな(不変のデータ構造)を重要視する

Page 39: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

蛇足

Page 40: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 41: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

最近の本(『実践関数プログラミング』)だと、いわゆる「Lisp」(正確にはCommon Lisp、Scheme)という理由だけで関数型言語の仲間には入れない感じ(Lispは”Lisp”というパラタイム)Common Lispはバリバリ、データ構造を変更しまくる。ただ、Clojureは不変のデータ構造を意識させるために仲間にされることはある(いちおう、Racket langという処理系も、明示的にデータをImmutableにすることは可能)

Page 42: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

歴史

Page 43: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

「オブジェクト指向」vs

「関数型プログラミング」

Page 44: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

「オブジェクト指向」vs

「関数型プログラミング」

Page 45: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 46: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 47: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

前段階としての構造化

プログラミング

Page 48: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

「順次、分岐、反復」の三種の神器

Page 49: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

top-down program development

+stepwise refinement

Page 50: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

批判

Page 51: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

構造化プログラミングは制御の流れしか捉えられておらん

Page 52: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

そもそも計算のパターンと

状態の変化そのものを対応するのは

難しいやろが

Page 53: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

代入

Page 54: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

そもそも変化とは何か

(哲学)

Page 55: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

参照透明性を一旦捨てると, 計算オブジェクトが「同じ」であるとは何を意味するかの概念を形式的に捕らえるのは難しくなる. 実はわれわれのプログラムがモデル化している実世界の「同じ」の意味もあまりはっきりしない. 一般に二つの見かけ上同じなオブジェクトが本当に「同じもの」であるかは, 一つのオブジェクトを変えてみて, もう一つのオブジェクトが同じように変っているかを見て決める. しかし「同じ」オブジェクトを二度観測し, オブジェクトのある性質が一回目と二回目の観測で違っているということ以外に, あるオブジェクトが「変った」ことがどうして分るだろうか. つまり何か先験的な 「同一」という概念なしに「変化」を決めることは出来ず, 変化の効果を観測することなしに同一性を決めることは出来ない.(SICPより)

Page 56: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

手続き型プログラムを学ぶ際の障壁の一つが代入(assignment)の概念であることは随所で指摘されている。これは計算過程と計算状態という考え方が初心者にとっては新奇なものでなじめないということにも理由があろう。

Page 57: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

多くのプログラミング学習者が理解に苦しむ問題を調査した所、以

下のような結果が得られた。

●代入とシーケンス実行

●再帰と繰り返し実行

●並列実行

再帰やループはたしかに難しい。並列実行はとても難しいが、多く

の挫折者はそこまで到達しない。しかし、代入とシーケンス実行とい

う、プログラミングの最も基本的である概念の理解に苦しむとはどう

いうことか。 (60%の人間はプログラミングの素質がない - 本の虫)

Page 58: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

破壊的代入は強すぎる

Page 59: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

強すぎる=

ハイリスクハイリターン

Page 60: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

逆に関数型プログラミングの

理解のしにくさは何処にある

Page 61: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

調査

Page 62: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 63: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

大体こんな感じ?● インターネットがまだ無い時代に図書館で読み漁った本で、

まず、関数っていう物の意味が分からなかったんですよね。

● 「実行順序の無いプログラム」というのがよく分かりません。

「SQLもループ処理の一部を書いているだけだ」と理解して

いる私にとっては、ループを使わずにプログラムを書くという

ことが既に分かりません。

● 競技プログラミングの問題をたまに解いたりする程度です

が、最初は変数が書き換えられないということに大きな衝撃

を受けました。

Page 64: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

大体こんな感じ?● インターネットがまだ無い時代に図書館で読み漁った本で、

まず、関数っていう物の意味が分からなかったんですよね。

● 「実行順序の無いプログラム」というのがよく分かりません。

「SQLもループ処理の一部を書いているだけだ」と理解して

いる私にとっては、ループを使わずにプログラムを書くという

ことが既に分かりません。

● 競技プログラミングの問題をたまに解いたりする程度です

が、最初は変数が書き換えられないということに大きな衝撃

を受けました。

Page 65: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

多くのプログラミング学習者が理解に苦しむ問題を調査した所、以

下のような結果が得られた。

●代入とシーケンス実行

●再帰と繰り返し実行

●並列実行

再帰やループはたしかに難しい。並列実行はとても難しいが、多く

の挫折者はそこまで到達しない。しかし、代入とシーケンス実行とい

う、プログラミングの最も基本的である概念の理解に苦しむとはどう

いうことか。 (60%の人間はプログラミングの素質がない - 本の虫)

Page 66: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

再帰関数副作用

Page 67: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

関数

Page 68: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

関数型プログラミングにおける関数とは「与えられた入力の値のみから出力となる値をただ1つ決める規則」という数学的な意味での関数です(『実践関数プログラミング入

門』)

Page 69: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 70: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 71: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ちょっとまてや

Page 72: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 73: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

プログラミングの用語として、関数のような「(類似の)一連の処理をまとめた単位」をサブルーチン(subroutine)、もしくは手続き(procedure)とも呼ぶ.これらの概念の境界は必ずしも明確ではないが、手続きは処理だけを行い返り値を持たないもの、関数は返り値があるもの、と区別される傾向がある。

Page 74: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

問題は値を得ること

Page 75: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

テストが素早く済めば,もっと頻繁にテストができる. Lispでは(他のどのプログラミング言語でもそうだが),ソフトウェア開発はコード書きとテストのサイクルから成る. しかしLispではサイクルがとても短い: 関数1個毎,いや関数の部分毎でもいい. あらゆる部分を書くにつれてテストすれば, エラーが起きたときにどこを見ればいいか分かるだろう: 最後に書いた部分だ.単純に聞こえるが,この原則はボトムアップ・プログラミングを堅固なものにしている要因の 大きな割合を占めている.それは更なる自信をもたらし,Lispプログラマは(少なくともある一時) 古い「計画−実装」スタイルのソフトウェア開発からフリーになれるのだ.(『On Lisp』より)

Page 76: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

問題は、このようなボトムアップなコーディングにあまり慣れない

Page 77: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

部分を寄せ合わせるという発想

Page 78: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

再帰

Page 79: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015
Page 80: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

再帰は数学から生まれた有用な技法である。再帰コードは一般に、反復コードよりも短くて書きやすい。

Page 81: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ちょっとまてや

Page 82: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

whileにおける反復のポイント

● 変数を初期化● 条件を満たしているならwhileのブロックの最初に戻る

● 変数に新しい値を代入する

Page 83: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

PythonにおけるWhile

a = 0

while a < 100: a += 1 print(a)

Page 84: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

あれ?ブロックを関数でまとめちゃえば

いいんじゃないの?

Page 85: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

再帰からわかること

● 「ブロック」としてまとめることができる、ということはその「ブロック」自体を関数にすることが可能である

Page 86: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

Schemeにおける再帰

(define (ref-loop i j) (if (<= i j)

(begin(print i) (ref-loop (+ i 1)j))))

(ref-loop 1 100)

Page 87: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ソフトウェア開発はコード書きとテストのサイクルから成る.しかしLispではサイクルがとても短い: 関数1個毎,いや関数の部分毎でもいい.

Page 88: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

一気にロジックを書き上げようとすると死ぬ

Page 89: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

部分を寄せ合わせるときに

型チェックがあると便利(テストのサイクルに

組み込まれる)

Page 90: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

注意

Page 91: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

再帰は強すぎる

Page 92: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

だいたいの再帰を利用したループは

mapなどの高階関数で表現することが可能

Page 93: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

結論

Page 94: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

なぜ関数型プログラミングを

「説明」することが難しいのか

Page 95: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

トップレベルで書き下すことからボトムアップで

繋ぎ合わせていくという発想の転換が難しい

Page 96: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

ブロックで処理を数十行書くのではなく

細かく関数を切り分けて作り上げて繋げるというのが難しい

Page 97: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

逆に代入による計算過程と計算状態という考え方に慣れすぎているために難しい。

Page 98: メイキング オブ 関数型プログラミングマンガ - 関数プログラミング交流会 2015

泥団子のように関数を小さく始めてみよう