Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
はじめての函数型プログラミング                  うさみけんた            Zonu.EXE   2011年12月10日   関数型都市勉強会
あんた誰よò  うさみけんたò  技術趣味者  ò  プログラミング言語  ò  ガジェット… etc.ò  Rubyistです(∑ÿØ  ò  お仕事では、いろいろ。
はじめにò  函数ってなあに? からはじめますò  基本的には函数型プログラミングを知らない、    よくわからないひと向けな感じでò  函数型プログラミング言語じゃなくても    利点を巧く取り入れてプログラミングできるよ!ò  発表...
函数とは何かf (x) = 3x + 2   こんなの
わたしたちは算数で習ったò  f (x) = 3x + 2              x      -2     -1   0   1   2       y = 3x + 2               y      -4     -1  ...
函数とは何かò  英語では function (ファンクション)ò  函数(かんすう) = 関数  ò  漢字表記についてはいろんな経緯があるけど省略  ò  どうして上海をシャンハイと読むのか?  ò  (少くとも日本人には)どっち...
プログラムでは…ò  f (x) = 3x + 2ò  C言語なら、だいたいこんな感じに書けますね… int f(int x){                 printf(“%d, ”, f(0));     return 3 * x ...
ちょっと考えてみる#include <stdio.h>int main(void){    for(int n = -2; n <= 3; n++){        printf(“n=%2d f(n)=%2dn”, n, f(n));    ...
Pythonならどうするよfor n in range(-2, 3):    print “n=%2d f(n)=%2d” % (n, f(n))ò  range(-2, 3) = [-2, -1, 0, 1, 2] というリスト   ò ...
設計指向の違いò  キミの言語は何指向?  ò  C言語は手続き型プログラミング言語  ò  Pythonは手続き型+オブジェクト指向+函数型  ò  F#/Scalaは函数型+オブジェクト指向+手続き型  ò  Haskellは純粋...
設計指向の違い ò  手続き型 ò  オブジェクト指向 ò  函数型ò  処理の抽象化の違い=人間がどのように考えるかò  「大雑把に言って」コンパイラが最適化できるので    これらの間で実行の速度差は出にくくなっている ò  む...
改めて、函数型言語ò  一般的には、ラムダ計算の概念を論理的基盤にした    プログラミング言語のことを指すò  函数型言語では函数をお手軽に扱える ò  プログラム中で簡単に函数を定義したり、     変数に代入できたり、使い捨ての函数...
函数型言語の系統ò  LISP (LISt Processing)   ò  Scheme   ò  Common Lisp   ò  Emacs Lispò  ML (Meta-Language)   ò  Standard ML...
R.I.P.
手続き型の中の函数型ò  函数型言語で培われた要素は、部分的に    手続き型言語にも持ち込まれているò  例えば: Ruby、Python、JavaScriptなどは  ò  簡単に配列(リスト)を使って反復処理ができる  ò  プロ...
JavaScriptだと…// function文で定義する場合function f1(x){    return 3 * x + 2;}// function式に代入する場合var f2 = function(x){ return 3 * x...
Rubyだと# lambdaメソッドでf1 = lambda{|x|    return 3 * x + 2;}f1[5] #=> 17# lambdaを配列のそれぞれに適用[-2,-1,0,1,2].map{|x| return f1[x] ...
Pythonなら…再び# 順番に実行されるだけなのでMapではないdef f1(x):    return 3 * x + 2for n in range(-2, 3):    print f(n)# リスト内包 = map と同じ[f1(n)...
ラムダ計算とは何かò  ラムダ計算(lambda calculus)は、理論計算機科学や    数理論理学における、関数の定義と実行を抽象化した    計算体系である。ラムダ算法とも言う。ò  例えば、ある数に 2 を加える関数 f を考え...
Pythonならラムダ計算もò  RubyでもJavaScriptでもできるんですけどねò  Pythonでラムダ計算 - DT戦記(zonu_exeの日記)  ò  この内容を実演しました  ò  別にPythonはラムダが得意なわけ...
発表ここまでò  以下のスライドは後からの補足。
質疑応答ò  好きな函数型言語は? ò  F#です(∑ÿØ ò  最近は「ふつうのHaskellプログラミング」を読んでる   ò  でもまづはF#ですよね
質疑応答ò  Pythonのmapを避けたのはなぜか?  ò  Pythonの作者がLisp的なmapとかlambdaを入れるのが      嫌だったらしいので避けました  ò  Pythonでは函数内にローカル変数を作れるので、    ...
質疑応答ò  Pythonでは再帰でスタックを食い潰さないか ò  すみません、調べてませんでした   ò  末尾最適化はしてくれないらしいです ò  多くの函数型言語では末尾最適化してくれて、     機械語レベルではループに置換されます
あとから気付いたò  手続き型って何よ、ってことをしっかり説明できて    ないよねò  説明なしに「(値)に函数を適用」って喋ってたよねò  C++11にはlambdaあるよね、も盛り込んでおけば    おいしかったかもしれないò  ...
Upcoming SlideShare
Loading in …5
×

関数型都市忘年会『はじめての函数型プログラミング』

2,257 views

Published on

関数型都市忘年会(2011/12/10)で発表しました
http://atnd.org/events/21895

Published in: Technology

関数型都市忘年会『はじめての函数型プログラミング』

  1. 1. はじめての函数型プログラミング うさみけんた Zonu.EXE 2011年12月10日 関数型都市勉強会
  2. 2. あんた誰よò  うさみけんたò  技術趣味者 ò  プログラミング言語 ò  ガジェット… etc.ò  Rubyistです(∑ÿØ ò  お仕事では、いろいろ。
  3. 3. はじめにò  函数ってなあに? からはじめますò  基本的には函数型プログラミングを知らない、 よくわからないひと向けな感じでò  函数型プログラミング言語じゃなくても 利点を巧く取り入れてプログラミングできるよ!ò  発表者は初心者です!!1 ←重要
  4. 4. 函数とは何かf (x) = 3x + 2 こんなの
  5. 5. わたしたちは算数で習ったò  f (x) = 3x + 2 x -2 -1 0 1 2 y = 3x + 2 y -4 -1 2 5 8ò  この例は一次方程式の函数 ò  ある数 x に対して、対応する値 y を計算して返す ò  y = 3! ("2) + 2 y = 3! (1) + 2 = 5 = "6 + 2 = "4ò  ほかにも三角函数とか対数函数とか高校(数学IIとか) でやった気がしますね
  6. 6. 函数とは何かò  英語では function (ファンクション)ò  函数(かんすう) = 関数 ò  漢字表記についてはいろんな経緯があるけど省略 ò  どうして上海をシャンハイと読むのか? ò  (少くとも日本人には)どっちでもいいò  このセッションに限っては「函数」で統一します
  7. 7. プログラムでは…ò  f (x) = 3x + 2ò  C言語なら、だいたいこんな感じに書けますね… int f(int x){ printf(“%d, ”, f(0)); return 3 * x + 2; printf(“%d, ”, f(1)); } printf(“%d ”, f(2)); 2, 5, 8 for(int n = -2; n <= 3; n++){ n=-2 f(n)=-4 printf(“n=%2d f(n)=%2dn”, n, f(n)); n=-1 f(n)=-1 } n= 0 f(n)= 2 ………
  8. 8. ちょっと考えてみる#include <stdio.h>int main(void){ for(int n = -2; n <= 3; n++){ printf(“n=%2d f(n)=%2dn”, n, f(n)); } return 0;}ò  このプログラムの問題点 ò  ぶっちゃけ、継続条件を考えるのめんどくないです? ò  うっかり n < 3 とか n >= 3 とか書いちゃったら…?
  9. 9. Pythonならどうするよfor n in range(-2, 3): print “n=%2d f(n)=%2d” % (n, f(n))ò  range(-2, 3) = [-2, -1, 0, 1, 2] というリスト ò  range(a, b) は「a 以上 b 未満」 と読めるò  n の値は -2, -1, 0, 1 2 と変化するò  コードのメリット ò  継続条件が「ない」 ò  リストの各要素に対して処理を実行
  10. 10. 設計指向の違いò  キミの言語は何指向? ò  C言語は手続き型プログラミング言語 ò  Pythonは手続き型+オブジェクト指向+函数型 ò  F#/Scalaは函数型+オブジェクト指向+手続き型 ò  Haskellは純粋函数型プログラミング言語ò  補足 ò  どの言語でその記述ができるか、という話ではない ò  例: C言語でもオブジェクト指向プログラミングは可能
  11. 11. 設計指向の違い ò  手続き型 ò  オブジェクト指向 ò  函数型ò  処理の抽象化の違い=人間がどのように考えるかò  「大雑把に言って」コンパイラが最適化できるので これらの間で実行の速度差は出にくくなっている ò  むしろ、メモリの型付けシステムによって差がつく ò  CやC++、F#などは静的型付けの仲間 = 速い
  12. 12. 改めて、函数型言語ò  一般的には、ラムダ計算の概念を論理的基盤にした プログラミング言語のことを指すò  函数型言語では函数をお手軽に扱える ò  プログラム中で簡単に函数を定義したり、 変数に代入できたり、使い捨ての函数を作ったり!ò  抽象度の高いループ ò  リストに対する処理 ò  再帰処理
  13. 13. 函数型言語の系統ò  LISP (LISt Processing) ò  Scheme ò  Common Lisp ò  Emacs Lispò  ML (Meta-Language) ò  Standard ML (SML) ò  OCaml, F# ò  (Haskell) (Scala)
  14. 14. R.I.P.
  15. 15. 手続き型の中の函数型ò  函数型言語で培われた要素は、部分的に 手続き型言語にも持ち込まれているò  例えば: Ruby、Python、JavaScriptなどは ò  簡単に配列(リスト)を使って反復処理ができる ò  プログラム中で簡単に函数(相当)を定義して使える
  16. 16. JavaScriptだと…// function文で定義する場合function f1(x){ return 3 * x + 2;}// function式に代入する場合var f2 = function(x){ return 3 * x + 2 }// 作成した函数をそのままで使用する場合console.log( function(x){ return 3 * x + 2 }(5) )// 配列をその場で作って、それぞれにf1を適用[-2,-1,0,1,2].map(f1)//=> [-4, -1, 2, 5, 8]// その場で作った配列にその場で作った函数をry[-2,-1,0,1,2].map(function(x){return 3 * x + 2 })
  17. 17. Rubyだと# lambdaメソッドでf1 = lambda{|x| return 3 * x + 2;}f1[5] #=> 17# lambdaを配列のそれぞれに適用[-2,-1,0,1,2].map{|x| return f1[x] }#=> [-4, -1, 2, 5, 8]# lambdaを配列のそれぞれに適用[-2,-1,0,1,2].map{|x| return 3 * x + 2;}#=> [-4, -1, 2, 5, 8]
  18. 18. Pythonなら…再び# 順番に実行されるだけなのでMapではないdef f1(x): return 3 * x + 2for n in range(-2, 3): print f(n)# リスト内包 = map と同じ[f1(n) for n in range(-2, 3)]#=> [-4, -1, 2, 5, 8]# リスト内包: for 内で関数を作れる[ (lambda x: 3*x+2)(n) for n in range(-2, 3)]#=> [-4, -1, 2, 5, 8]
  19. 19. ラムダ計算とは何かò  ラムダ計算(lambda calculus)は、理論計算機科学や 数理論理学における、関数の定義と実行を抽象化した 計算体系である。ラムダ算法とも言う。ò  例えば、ある数に 2 を加える関数 f を考える。これは 通常の書き方では f(x) = x + 2 と書くことができるだ ろう。この関数 f は、ラムダ計算の式(ラムダ式とい う)では λx. x + 2 と書かれる。……この関数に 3 を 適用した結果の数 f(3) は (λx. x + 2) 3 と書かれる。 ò  以上、Wikipediaより引用 (ja.Wp: ラムダ計算)
  20. 20. Pythonならラムダ計算もò  RubyでもJavaScriptでもできるんですけどねò  Pythonでラムダ計算 - DT戦記(zonu_exeの日記) ò  この内容を実演しました ò  別にPythonはラムダが得意なわけではないです
  21. 21. 発表ここまでò  以下のスライドは後からの補足。
  22. 22. 質疑応答ò  好きな函数型言語は? ò  F#です(∑ÿØ ò  最近は「ふつうのHaskellプログラミング」を読んでる ò  でもまづはF#ですよね
  23. 23. 質疑応答ò  Pythonのmapを避けたのはなぜか? ò  Pythonの作者がLisp的なmapとかlambdaを入れるのが 嫌だったらしいので避けました ò  Pythonでは函数内にローカル変数を作れるので、 ちょっと面倒でもdefで名前付きの函数を作るのが正統 ò  その観点では「Pythonでラムダ計算」は邪道!
  24. 24. 質疑応答ò  Pythonでは再帰でスタックを食い潰さないか ò  すみません、調べてませんでした ò  末尾最適化はしてくれないらしいです ò  多くの函数型言語では末尾最適化してくれて、 機械語レベルではループに置換されます
  25. 25. あとから気付いたò  手続き型って何よ、ってことをしっかり説明できて ないよねò  説明なしに「(値)に函数を適用」って喋ってたよねò  C++11にはlambdaあるよね、も盛り込んでおけば おいしかったかもしれないò  C++のラムダとデリゲートの話も(ry

×