関数型を盲信するその前に
@hajikami
13/Dec./2014
第1回 Scala関西勉強会
13/Dec./2014 関数型を盲信するその前に @hajikami
2
自己紹介
● @hajikami
● 業務系システムの人
– ここ一年、ろくにプログラムを書いていない
● 英語をぼちぼち
– TOEIC は 750 点ぐらいで安定中
– 今は Pokémon をプレイしています。英語で
● 最新作は、日本で普通に買ったら、英語でも選べるよ!
13/Dec./2014 関数型を盲信するその前に @hajikami
3
目次
1.はじめに
2.言いたいことの5割ぐらいを書いたスライド
3.オブジェクト的 と 手続き的 と 関数的
4.学習コスト と その他ごちゃごちゃ
5.関数型のメリット
6.もっかい、学習コスト
7.まとめ
13/Dec./2014 関数型を盲信するその前に @hajikami
4
はじめに
● このLTは、色々と聞きかじったことを基に、
自分なりのエッセンスを加えてまとめたものです
● 例外を全力で無視しています
●
半分ぐらいネタです/半分ぐらい本気です
13/Dec./2014 関数型を盲信するその前に @hajikami
5
言いたいことの5割ぐらい
オブジェクト的 S.V(...) [→ Target]
手続き的
V(...) [→ Target]
How
関数的 What
13/Dec./2014 関数型を盲信するその前に @hajikami
6
オブジェクト的 と 手続き的
● オブジェクト的 … 行為者に着目
● 『オブジェクト』さんが、『メソッド』をする
● 『オブジェクト』さんの『メンバ変数』
● 結果、書くときにはこうなることが多い
●
主語.動詞(目的語など)
– He has a pen … 英語の語順と一緒
●
属格.名詞
– これも、英語の My father という語順と一緒
13/Dec./2014 関数型を盲信するその前に @hajikami
7
オブジェクト的 と 手続き的
● 手続き的 … 行為に着目
● 『プロシージャ』をする
– あえて主語を書くなれば、
『コンピュータ』が『プロシージャ』をする
● 結果、書くときにはこうなることが多い
●
動詞(目的語など)
– has a pen … 主語を省略した英語の語順と一緒
13/Dec./2014 関数型を盲信するその前に @hajikami
8
手続き的 と 関数的
● 手続き的 … How
● どのようにするか
– 役員の一覧がほしいから、
ループを回して、条件に当てはまるものを抜き出して…
● オブジェクト的な考え方: V の手段には興味が無
い
● S が V さえしてくれれば、 V の中身はどうでもいい
13/Dec./2014 関数型を盲信するその前に @hajikami
9
手続き的 と 関数的
● 関数的 … What
● 何を手に入れるか
– 役員の一覧
● とよく言われているけど、プログラマとしては
ぶっちゃけ How で考えていることもあるよね
● リストを渡して、
再帰を使って別のリストを返すような処理とか
● 「何を手に入れるか」を、「どのように」組み合わせるか
ってプログラミングスタイルともいえる
13/Dec./2014 関数型を盲信するその前に @hajikami
10
学習コスト
● 前提が大きく変わるものを学ぶのは大変
● 関数型と手続き型って、かなり違う
– 手続き的なプログラミングで覚えてきたパターンは、
関数的なプログラミングでは使えないことが多い
● 最後は、学習コストと得られるものとの兼ね合い
● 趣味であれば、惜しみなくコストを使えるけどね…
13/Dec./2014 関数型を盲信するその前に @hajikami
11
その他ごちゃごちゃ
● 関数型…と言われると、以下が混ざってくる
● 状態を持たない
– って言うけど、再帰とか組んでる時には「途中の状態」を想像するよね
– 状態が持てる Scala って言語はどうなるんですか!
● What を書いているから読みやすい
– コレクションAPIのおかげではあるけれども、
頭のシフトが出来れば、このメリットはかなり大きい
– 手続き型でも、手続きの分割と名付けで、ある程度は回避できるか…?
● 副作用がない
– 手続き型でも、副作用のないプログラム書けるよね
● 遅延評価
– これは関数型そのものとは直接関係ないよね
13/Dec./2014 関数型を盲信するその前に @hajikami
12
関数型のメリット
● What を書いているから読みやすい(再掲)
● だらだらと長く書くことが、しにくい
● 長く書こうとするほうが大変
● 1関数に2つ以上の機能…ということがない
● 短い、つまり、読んでる間に覚えておくことが少ない
● 人間がやってしまいがちなアンチパターンを
システム的に防いでしまえるのは、大きな利点
13/Dec./2014 関数型を盲信するその前に @hajikami
13
もっかい、学習コスト
● インプットって実はめちゃくちゃ大切
● インプットのないアウトプットは『ゴミ』
● 一定量の良質なインプットを保ちつつ、
少しのアウトプットを直してもらうことで、成長する
● ってことは、やっぱり学習コスト高い
● とはいえ、プログラミング言語は、多くの場合、
自然言語のサブセットなので、自然言語よりはマシ
● 変化のスピードは7倍(dog year)かもしれないけど…
13/Dec./2014 関数型を盲信するその前に @hajikami
14
文法事項が近いということ
● 言語がパラダイム的に遠くても、文法事項が近しければ、
覚えているパターンを使いまわせる
● 諸外国語の「~したい」って、けっこう似てるよ
– I want to do.
– Je veux faire.
– ‫לעשות‬ ‫רוצה‬ ‫אני‬.
– 我想做。
● 逆にいうと、似てない文法事項は覚えているパターンを使いま
わせない
– てかこれ、日本語が違いすぎるんじゃー!! (ノ#`皿´)ノ┻┻;:'、・゙;
13/Dec./2014 関数型を盲信するその前に @hajikami
15
まとめ
● プログラミングにはいろいろなパラダイムがある
● 関数型もその一つ
● 関数型言語を使うことが最善というわけではない
● 移行するための学習コストが高い
● 気をつけながらプログラムを書いていれば、
関数型でよく言われるメリットは
手続き型でもそこそこ享受できる
● 関数型言語そのものを使うのもいいけど、
関数型を学ぶことで得た知識を使っていくことも大切
13/Dec./2014 関数型を盲信するその前に @hajikami
16
以上
ありがとうございました
…いいのか、この結論でorz

関数型を盲信するその前に