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

1,531 views

Published on

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

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,531
On SlideShare
0
From Embeds
0
Number of Embeds
352
Actions
Shares
0
Downloads
6
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

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

×