Upload
parrotstudio
View
839
Download
1
Embed Size (px)
DESCRIPTION
2013/05/18に「Gunma.web #13」でプレゼンするはずだった資料 ソースはこちら https://github.com/parrot-studio/gunmaweb13-functional-language-retry
Citation preview
「もうなにもこわくない」関数型言語 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
DevelopersSummit
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 endend
「もうなにもこわくない」関数型言語 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 retend
「もうなにもこわくない」関数型言語 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
「もうなにもこわくない」関数型言語 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 retend
「もうなにもこわくない」関数型言語 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 retend
「もうなにもこわくない」関数型言語 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
「もうなにもこわくない」関数型言語 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
「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
もうめんどいからガード条件も合体
def rooms (self.blocks || []).select(&:has_rooms?).collect(&:rooms).flattenend
※空リスト([])の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
ありがとうございました(´・ω・)っ旦~