「もうなにもこわくない」関数型言語...

50
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18 「もうなにもこわくな い」 関数型言語 ふつうのプログラマが 関数型言語を知るべき理由・reload ぱろっと(@parrot_studio) Gunma.web #13

Upload: parrotstudio

Post on 05-Jul-2015

839 views

Category:

Technology


1 download

DESCRIPTION

2013/05/18に「Gunma.web #13」でプレゼンするはずだった資料 ソースはこちら https://github.com/parrot-studio/gunmaweb13-functional-language-retry

TRANSCRIPT

Page 1: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

「もうなにもこわくない」

関数型言語ふつうのプログラマが

関数型言語を知るべき理由・reload

ぱろっと(@parrot_studio)Gunma.web #13

Page 2: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

注意事項

本スライドは「Gunma.web #13」で発表するはずのものでした

当日ドタキャンしたため、一度も外部で発表していません

情報は2013/05時点のものであり、今となっては古いものが多いです

Page 3: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

それでは本編を

(´・ω・)っ

Page 4: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

Profile

ぱろっと(T.Tachiki)

@parrot_studio

parrot-studio.com

プログラマっぽい何か

(比較的)言語マニア

Page 5: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

2013/02/14

Page 6: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

DevelopersSummit

2013

Page 7: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"こわくない関数型言語"

http://event.shoeisha.jp/detail/1/session/13/

Page 8: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

結論

Page 9: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

関数型怖い(((((( ;゚Д゚)))))

Page 10: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

このセッションで聞いた大事なこと

Page 11: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

大事なこと

"関数型言語があるのではない、関数型プログラミングがあるだけだ"

Page 12: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"関数型プログラミング"とは?

Page 13: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

それやったわー2年前にやったわー

http://www.slideshare.net/parrotstudio/gunmaweb-5-20110514

Page 14: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

でも、あれいまいち(´・ω・`)

Page 15: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

私たちが知りたいこと

「どう書くと”それっぽい”のか?」

Page 16: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

その一例

Page 17: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

以下の条件をつけて書く

else/elsifを使わない

for(;;)文を使わない

Page 18: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

you may say...

"こんなの絶対おかしいよ"

Page 19: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

極力使わないでどう書けるかを考える

Page 20: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

elseを使えない?

三項演算子

case文

ガード条件(後置構文)

メソッドの細分化

Page 21: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

forが使えない?

リストベースの処理

each/select/find/map...

再帰

Page 22: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

実際にやってみよう(`・ω・´)

Page 23: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

例:書きたいコード

blockの中にある(かもしれない)roomのリストをくれщ(゚Д゚щ)

Page 24: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

Rubyでとりあえず書く

def get_room_list_from_blocks if self.blocks.nil? return [] elsif self.blocks.size <= 0 return [] else ret = [] for i in (0..self.blocks.size) rooms = self.blocks[i].rooms if rooms.size > 0 for j in (0..rooms.size) ret << b.rooms[j] end end end return ret endend

Page 25: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

間違ってはいないけども・・・

(´-ω-)

Page 26: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

ガード条件は後置構文ですっきり

def get_room_list_from_blocks return [] if (self.blocks || []).empty?

ret = [] for i in (0..self.blocks.size) rooms = self.blocks[i].rooms for j in (0..rooms.size) ret << b.rooms[j] end end return retend

Page 27: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"for"を"each"に変えよう

def get_room_list_from_blocks return [] if (self.blocks || []).empty?

ret = [] self.blocks.each do |b| rooms = b.rooms unless rooms.empty? rooms.each do |r| ret << r end end end return retend

Page 28: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

blockはroomsを持っているか知っているよね?

class Block # ...

def has_rooms? self.rooms.empty? ? false : true end

# ...end

Page 29: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"roomsを持っているblockを選ぶ"ようにしましょう

def get_room_list_from_blocks return [] if (self.blocks || []).empty?

ret = [] bs = self.blocks.select(&:has_rooms?) bs.each do |b| b.rooms.each{|r| ret << r} end return retend

Page 30: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

リストを処理するメソッドにはこんなものも

collect : リストから評価した値を集める個人的にはmapをよく使う

flatten : リストを平坦にする[1, [2,3], [4, [5,6]]].flatten => [1,2,3,4,5,6]

Page 31: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"collect"や"flatten"も使いましょう

def get_room_list_from_blocks return [] if (self.blocks || []).empty? ret = self.blocks.select(&:has_rooms?).collect(&:rooms).flatten return retend

Page 32: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

Rubyは「最後に評価した値を返す」のでreturnいりません

def get_room_list_from_blocks return [] if (self.blocks || []).empty? self.blocks.select(&:has_rooms?).collect(&:rooms).flattenend

Page 33: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

「名前」はわかりやすくシンプルに

def rooms return [] if (self.blocks || []).empty? self.blocks.select(&:has_rooms?).collect(&:rooms).flattenend

Page 34: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

もうめんどいからガード条件も合体

def rooms (self.blocks || []).select(&:has_rooms?).collect(&:rooms).flattenend

※空リスト([])のselectやcollectも[]を返す

Page 35: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

一行Σ(゚Д゚)

Page 36: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

しかも・・・

blocks.select(&:has_rooms?).collect(&:rooms).flatten

「blocksからroomsを持ったものを選び、roomsを集めてリストにして返す」と読める

Page 37: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

ね、簡単でしょう

(´・ω・)?

Page 38: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

「簡単」の定義とは

【審議中】(´・ω) (´・ω・) (・ω・`)

Page 39: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

冗談はさておき

Page 40: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

関数型っぽく書くと・・・

定義の羅列になる

なんとなく読める

意図・目的が明確に

Page 41: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

そうは言うがな大佐・・・

Page 42: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

"いや、私には関係ないし"

関数型とか使う機会ないですし

Rubyなんてあいまいな言語で書きませんしJavaの方がしっかりしてますし

サーバサイド書きませんし

ScalaでWebとかありえませんし

Page 43: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

ありえない・・・?

http://www.playframework.com/

Page 44: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

Javaと関数型は関係ない・・・?

http://d.hatena.ne.jp/nowokay/20130504#1367702641

Page 45: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

サーバサイドはやらないから関係ない・・・?

JavaScriptはLispの子孫

最近のjQueryはだいぶ「それっぽい」記述に特に非同期イベント周り

Page 46: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

もはや、逃げ場はない(lll゚Д゚)

Page 47: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

you may write...

"やっぱり関数型こわい

(((((( ;゚Д゚)))))"

Page 48: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

すぐにできること

メソッドを簡潔にまとめるメソッド内のネストを深くしすぎない

深くなる場合はたいてい大きすぎる

「言葉」を重視する結局、その処理は「何をしたい」のか?

Page 49: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

できるところからやってみよう

Page 50: 「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜

「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18

ありがとうございました(´・ω・)っ旦~