関数型を盲信するその前に
TRANSCRIPT
関数型を盲信するその前に
@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