Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

More Decks by ぱろっと(parrot-studio)

Other Decks in Technology

Transcript

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

    View Slide

  2. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    注意事項
    本スライドは「Gunma.web
    #13」で発表するはずのものでした
    当日ドタキャンしたため、一度も外
    部で発表していません
    情報は2013/05時点のものであ
    り、今となっては古いものが多いで

    View Slide

  3. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    それでは
    本編を
    (´・ω・)っ

    View Slide

  4. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    Profile
    ぱろっと(T.Tachiki)
    @parrot_studio
    parrot-studio.com
    プログラマっぽい何か
    (比較的)言語マニア

    View Slide

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

    View Slide

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

    View Slide

  7. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    "こわくない関数型言語"
    http://event.shoeisha.jp/detail/1/session/13/

    View Slide

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

    View Slide

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

    View Slide

  10. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    このセッショ
    ンで聞いた
    大事なこと

    View Slide

  11. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    大事なこと
    "関数型言語があるのではない、
    関数型プログラミングがあるだけ
    だ"

    View Slide

  12. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    "関数型プロ
    グラミング"
    とは?

    View Slide

  13. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    それやったわー2年前にやった
    わー
    http://www.slideshare.net/parrotstudio/
    gunmaweb-5-20110514

    View Slide

  14. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    でも、あれ
    いまいち
    (´・ω・`)

    View Slide

  15. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    私たちが知りたいこと
    「どう書くと
    ”それっぽい”
    のか?」

    View Slide

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

    View Slide

  17. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    以下の条件をつけて書く
    else/elsifを使わない
    for(;;)文を使わない

    View Slide

  18. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    you may say...
    "こんなの絶対おか
    しいよ"

    View Slide

  19. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    極力使わな
    いでどう書け
    るかを考える

    View Slide

  20. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    elseを使えない?
    三項演算子
    case文
    ガード条件(後置構文)
    メソッドの細分化

    View Slide

  21. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    forが使えない?
    リストベースの処理
    each/select/find/map...
    再帰

    View Slide

  22. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    実際にや
    ってみよう
    (`・ω・´)

    View Slide

  23. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    例:書きたいコード
    blockの中にある(かもしれない)
    roomのリストをくれщ(゚Д゚щ)

    View Slide

  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

    View Slide

  25. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    間違ってはい
    ないけど
    も・・・
    (´-ω-)

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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]

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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も[]を返す

    View Slide

  35. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    一行
    Σ(゚Д゚)

    View Slide

  36. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    しかも・・・
    blocks.select(&:has_rooms?).collect(&:rooms).flatten
    「blocksからroomsを持ったものを
    選び、roomsを集めてリストにして返
    す」と読める

    View Slide

  37. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    ね、簡単で
    しょう
    (´・ω・)?

    View Slide

  38. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    「簡単」の定義とは
    【審議中】
    (´・ω) (´・ω・) (・ω・`)

    View Slide

  39. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    冗談は
    さておき

    View Slide

  40. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    関数型っぽく書くと・・・
    定義の羅列になる
    なんとなく読める
    意図・目的が明確に

    View Slide

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

    View Slide

  42. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    "いや、私には関係ないし"
    関数型とか使う機会ないですし
    Rubyなんてあいまいな言語で書き
    ませんし
    Javaの方がしっかりしてますし
    サーバサイド書きませんし
    ScalaでWebとかありえませんし

    View Slide

  43. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    ありえない・・・?
    http://www.playframework.com/

    View Slide

  44. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    Javaと関数型は関係ない・・・?
    http://d.hatena.ne.jp/nowokay/20130504#1367702641

    View Slide

  45. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    サーバサイドはやらないから関
    係ない・・・?
    JavaScriptはLispの子孫
    最近のjQueryはだいぶ「それっぽ
    い」記述に
    特に非同期イベント周り

    View Slide

  46. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    もはや、逃
    げ場はない
    (lll゚Д゚)

    View Slide

  47. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    you may write...
    "やっぱり
    関数型こわい
    (((((( ;゚Д゚)))))"

    View Slide

  48. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    すぐにできること
    メソッドを簡潔にまとめる
    メソッド内のネストを深くしすぎない
    深くなる場合はたいてい大きすぎる
    「言葉」を重視する
    結局、その処理は「何をしたい」のか?

    View Slide

  49. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    できるとこ
    ろからやっ
    てみよう

    View Slide

  50. 「もうなにもこわくない」関数型言語 by @parrot_studio for Gunma.web #13 on 2013/05/18
    ありがとう
    ございました
    (´・ω・)っ旦~

    View Slide