SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
「再代入なんて、あるわけない」
~ふつうのプログラマが関数型言語を知るべき理由~

                     There is no reassignment.


     Present by ぱろっと(@parrot_studio)
                   for Gunma.web #5
                        2011/05/14
Profile


Twitter : @parrot_studio
hatena/github : parrot_studio
第1話
「参照透明性も、遅延評価も、あるんだよ」

   Referential transparency and Lazy evaluation is here.
関数型言語
=数学の概念を実装したもの
関数型言語の
代表的な特性を3つ
  (´・ω・)っ
数学で

     s=α+β
  とか置いてから、後で

     s=αβ
と置きなおすなんてことはしない
   (s’=αβならある)
「s」は変数ではなく、
「α+β」に名前を「定義」しただけ
 (関数型では「束縛」と表現する)
It’s   再代入不可
だから「i += 1」なんてできない
CやJSのようなfor文は書けない

     Σ(゚Д゚)ガーン
=> 「再帰」「List処理」等を使う
逆に、こんなことは考えなくていい
 @a = 2 # 変数aに2を代入

 def f(x) # 変数aに加算して返す関数
  @a + x
 end

 puts f(2) #=> 2+2=4

 # 何か長い処理
 # 途中で @a=5 とかされるかも?

 puts f(2) # この値はいくつ(´・ω・)?
再代入ができない
=f(x)の値はxが決まれば一意に決まる
   (関数の呼び出しに副作用がない)
じゃあ、f(2)=4なら、

f(2)を4に全部置き換えていいよね?
It’s   参照透明性
“いつ”計算しても同じ値になるなら、

「必要になったら」計算しても
     同じだよね?
It’s   遅延評価
f(x) = (x-1)(なんか難しい式)
    のとき、f(1) = 0 は
後ろを計算しなくてもわかるよね?
でも・・・
俗に言う「関数型言語」が、
この3つを「全部」もっているかというと、
   そうでもないΣ(・ω・ノ)ノ
純関数型      全部「強制」
          例:Haskell
関数型       どれかが欠けているとか、オプション
          例:Scala/Erlang/OCaml
関数型風記述    関数型っぽく書ける
          例:最近流行の言語(Ruby/JS/C#等)
手続き型      関数型っぽく書くこと自体が難しい
          例:C/Java/Perl

         ※分類方法は個人的に考えた適当なものです
なぜ「関数型風」に書けると嬉しいのか?
「関数型言語」を使うとどんなことができるのか?
第2話
「宣言的なのはとっても嬉しいなって」

         It is very glad to declarative..
関数型(風)のコード
=「定義(define)」の連鎖
関数型っぽく書いたRubyのコード

def room_blocks
 blocks.select(&:has_room?)
end

def rooms
 room_blocks.collect(&:room)
end

def start_point
 rooms.sample(1).random_point
end
「手続き」ではなく
  「宣言・定義」
=「これは~です」が並ぶ
def room_blocks
 blocks.select(&:has_room?)
end

room_blocks とは blocksの中で
roomを持っているものを選んだものである
def rooms
 room_blocks.collect(&:room)
end

rooms とは room_blocks のroomを
集めたものである
def start_point
 rooms.sample(1).random_point
end

start_point とは roomsの中から
一つサンプリングして、
ランダムな座標を選んだものである
一つ一つの「定義」は小さいから、
個別のテスト(spec)も書きやすい
      (`・ω・´) b
あえて手続きで書くと・・・
 def room_blocks
  ret = []
  for i in (0..blocks.size)
    if blocks[i].has_room?
      ret << blocks[i]
    end
  end
  return ret
 end
「やりたいこと」が埋もれるので、
「読みやすい」というのは非常に重要
”名前重要” by matz
 「97きのこ」:J10 / 「コードの世界」:P150
第3話
「もうデッドロックは怖くない」

        Deadlock not afraid anymore.
関数の値が入力だけで決まるなら、
「いつ」「どこで」処理しても結果は同じ
なら、並列処理してもいいよね
    (´・ω・)?
並列処理手法の一つ:アクターモデル
アクターモデルの話だけで
LTどころではない時間を食うので、
     簡単に説明
アクターモデルの場合

    この処理を頼みたいんだが・・・

        あーそこのBOXに入れておいてください
        後でやっておきます


...φ(・ω・`)   各自の処理            ...φ(・ω・`)

              頼まれた処理終わりましたよ


    じゃあ、私のBOXに入れておいてくれ
    後で確認する



...φ(・ω・`)    各自の処理           ...φ(・ω・`)
「値」は「入力」によって決まり、
   「状態」に依存しないから、
アクター間で「状態」を共有する必要がない
      =ロックが不要
詳しくは・・・

ScalaのアクターモデルでMapReduce処理を書いてみる
    d.hatena.ne.jp/parrot_studio/20110205/1296880522
第4話
「本当の副作用と向き合えますか?」

     Can it be opposite to a true side effect?
関数型の概念自体は60年代からあるが、
   「時代」が関数型を求め始めた
 マルチコアCPU / サーバクラスタ(Hadoop等)
ほっといてもCPUは速くならない
プログラマが工夫する時代へ
  「フリーランチの終焉」
     matz@日経Linux 2011/05
もはや、
  「普通のプログラマ」と
関数型は無関係ではないかもしれない
実は、関数型の概念は理想的なもの
「画面に表示する」
  「DBやファイルからデータを読む」

どれもリソースに依存して結果が変わる
     =副作用がある
できるだけ副作用のある箇所を
局所的にして、切り離すことが重要
「読みやすく」「副作用の少ない」

関数型の概念を学んでみませんか
     (´・ω・)?
ありがとうございました
  (´・ω・)っ旦~
参考文献
【おまけ】
そもそも、Rubyは
「綺麗に書くほど速い=最適化される」
       言語
Rubyで先ほどのような
   for文はまず使わない
確実に「もっと美しい書き方」がある
Rubyを「知る」には
実は関数型の概念がいる


私がRubyのありがたさを実感したのは
  「ふつうのHaskell」を読んだ後
実際、関数型として書いたRubyと
元々関数型のScalaのコードは
   非常によく似ている
コマ大数学科の問題をRubyとScalaで解いてみる
    d.hatena.ne.jp/parrot_studio/20110302/1299051431

Contenu connexe

Tendances

社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
Akihiro Ikezoe
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 

Tendances (20)

世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 

Similaire à 「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 
関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013
Esehara Shigeo
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 

Similaire à 「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14) (20)

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013関数型志向Python - LLまつり2013
関数型志向Python - LLまつり2013
 
普通のプログラミング言語R
普通のプログラミング言語R普通のプログラミング言語R
普通のプログラミング言語R
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
私に作る時間がないのはどう考えても仕事が悪い!? (Gunma.web #10 2012/09/08)
私に作る時間がないのはどう考えても仕事が悪い!? (Gunma.web #10 2012/09/08) 私に作る時間がないのはどう考えても仕事が悪い!? (Gunma.web #10 2012/09/08)
私に作る時間がないのはどう考えても仕事が悪い!? (Gunma.web #10 2012/09/08)
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 

Plus de parrotstudio

Plus de parrotstudio (14)

"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
"プロのプログラマ"を目指す初心者が最初に読むべきたった一冊の本
 
希望の関数と絶望の副作用
希望の関数と絶望の副作用希望の関数と絶望の副作用
希望の関数と絶望の副作用
 
「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜
「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜
「もうなにもこわくない」関数型言語 〜ふつうのプログラマが関数型言語を知るべき理由・reload〜
 
ぱろっと、Padrinoやめるってよ
ぱろっと、Padrinoやめるってよぱろっと、Padrinoやめるってよ
ぱろっと、Padrinoやめるってよ
 
エンジニアがTRPGをやるべき理由 〜隣り合わせの遊びと技術〜 (Gunma.web #12 2013/02/09)
エンジニアがTRPGをやるべき理由 〜隣り合わせの遊びと技術〜  (Gunma.web #12 2013/02/09)  エンジニアがTRPGをやるべき理由 〜隣り合わせの遊びと技術〜  (Gunma.web #12 2013/02/09)
エンジニアがTRPGをやるべき理由 〜隣り合わせの遊びと技術〜 (Gunma.web #12 2013/02/09)
 
(´・ω・`)としたーは衰退しました (Gunma.web #11 2012/11/23)
(´・ω・`)としたーは衰退しました  (Gunma.web #11 2012/11/23) (´・ω・`)としたーは衰退しました  (Gunma.web #11 2012/11/23)
(´・ω・`)としたーは衰退しました (Gunma.web #11 2012/11/23)
 
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
ネタプログラミング言語クリエイターYouma (Gunma.web #8 2012/03/03)
 
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
 
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03)
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03) Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03)
Signs;Gate - RESTfulなサイトの作り方 (Gunma.web #6 2011/09/03)
 
思い通りにいかないのがWebなんて 割り切りたくないから (Gunma.web #4 2011/02/12)
思い通りにいかないのがWebなんて 割り切りたくないから (Gunma.web #4 2011/02/12)思い通りにいかないのがWebなんて 割り切りたくないから (Gunma.web #4 2011/02/12)
思い通りにいかないのがWebなんて 割り切りたくないから (Gunma.web #4 2011/02/12)
 
俺の体がこんなにすっきりしているわけがない ~5分でわかる催眠プログラミング~ (Gunma.web #3 2010/12/11)
俺の体がこんなにすっきりしているわけがない ~5分でわかる催眠プログラミング~ (Gunma.web #3 2010/12/11) 俺の体がこんなにすっきりしているわけがない ~5分でわかる催眠プログラミング~ (Gunma.web #3 2010/12/11)
俺の体がこんなにすっきりしているわけがない ~5分でわかる催眠プログラミング~ (Gunma.web #3 2010/12/11)
 
「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)
「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)
「一番いいおすすめを頼む」 ~5分でわかるレコメンドエンジンの基礎~ (Gunma.web #3 2010/12/11)
 
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
 
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
どきっ!三行で作るランダムダンジョン!?~WEBもあるよ!~ - 2010/8/21 群馬Web研究会(勉強会)
 

Dernier

Dernier (7)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)