「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
「もうなにもこわくな
い」
関数型言語
ふつうのプログラマが
関数型言語を知るべき理由・reload
ぱろっと(@parrot_studio)
Gunma.web #13
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
注意事項
本スライドは「Gunma.web
#13」で発表するはずのものでした
当日ドタキャンしたため、一度も外
部で発表していません
情報は2013/05時点のものであ
り、今となっては古いものが多いで
す
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
それでは
本編を
(´・ω・)っ
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
Profile
ぱろっと(T.Tachiki)
@parrot_studio
parrot-studio.com
プログラマっぽい何か
(比較的)言語マニア
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
2013/02/14
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
Developers
Summit
2013
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
"こわくない関数型言語"
http://event.shoeisha.jp/detail/1/session/13/
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
結論
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
関数型怖い(((((( ;゚Д゚)))))
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
このセッショ
ンで聞いた
大事なこと
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
大事なこと
"関数型言語があるのではない、
関数型プログラミングがあるだけ
だ"
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
"関数型プロ
グラミング"
とは?
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
それやったわー2年前にやった
わー
http://www.slideshare.net/parrotstudio/
gunmaweb-5-20110514
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
でも、あれ
いまいち
(´・ω・`)
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
私たちが知りたいこと
「どう書くと
”それっぽい”
のか?」
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
その
一例
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
以下の条件をつけて書く
else/elsifを使わない
for(;;)文を使わない
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
you may say...
"こんなの絶対おか
しいよ"
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
極力使わな
いでどう書け
るかを考える
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
elseを使えない?
三項演算子
case文
ガード条件(後置構文)
メソッドの細分化
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
forが使えない?
リストベースの処理
each/select/find/map...
再帰
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
実際にや
ってみよう
(`・ω・´)
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
例:書きたいコード
blockの中にある(かもしれない)
roomのリストをくれщ(゚Д゚щ)
「もうなにもこわくない」関数型言語 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
end
end
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
間違ってはい
ないけど
も・・・
(´-ω-)
「もうなにもこわくない」関数型言語 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 ret
end
「もうなにもこわくない」関数型言語 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 ret
end
「もうなにもこわくない」関数型言語 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
「もうなにもこわくない」関数型言語 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 ret
end
「もうなにもこわくない」関数型言語 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]
「もうなにもこわくない」関数型言語 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 ret
end
「もうなにもこわくない」関数型言語 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).flatten
end
「もうなにもこわくない」関数型言語 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).flatten
end
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
もうめんどいからガード条件も
合体
def rooms
(self.blocks || []).select(&:has_rooms?).collect(&:rooms).flatten
end
※空リスト([])のselectやcollectも[]を返す
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
一行
Σ(゚Д゚)
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
しかも・・・
blocks.select(&:has_rooms?).collect(&:rooms).flatten
「blocksからroomsを持ったものを
選び、roomsを集めてリストにして返
す」と読める
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
ね、簡単で
しょう
(´・ω・)?
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
「簡単」の定義とは
【審議中】
(´・ω) (´・ω・) (・ω・`)
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
冗談は
さておき
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
関数型っぽく書くと・・・
定義の羅列になる
なんとなく読める
意図・目的が明確に
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
そうは言う
がな
大佐・・・
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
"いや、私には関係ないし"
関数型とか使う機会ないですし
Rubyなんてあいまいな言語で書き
ませんし
Javaの方がしっかりしてますし
サーバサイド書きませんし
ScalaでWebとかありえませんし
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
ありえない・・・?
http://www.playframework.com/
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
Javaと関数型は関係ない・・・?
http://d.hatena.ne.jp/nowokay/20130504#1367702641
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
サーバサイドはやらないから関
係ない・・・?
JavaScriptはLispの子孫
最近のjQueryはだいぶ「それっぽ
い」記述に
特に非同期イベント周り
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
もはや、逃
げ場はない
(lll゚Д゚)
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
you may write...
"やっぱり
関数型こわい
(((((( ;゚Д゚)))))"
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
すぐにできること
メソッドを簡潔にまとめる
メソッド内のネストを深くしすぎない
深くなる場合はたいてい大きすぎる
「言葉」を重視する
結局、その処理は「何をしたい」のか?
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
できるとこ
ろからやっ
てみよう
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
ありがとう
ございました
(´・ω・)っ旦~

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