SlideShare ist ein Scribd-Unternehmen logo
1 von 39
ラムダ計算入門
  yingtai
自己紹介

• 67回生
• twitter: @_yingtai
• 部誌でラムダ計算のこと書いた
• Haskellerワナビ
LTの動機

• ラムダ計算が人口に膾炙していない
 • 部誌書いたのに...
 • ※部誌の内容は信用しちゃだめです
流れ

• ラムダ計算入門
• データ型の表現
ラムダ計算入門
ラムダ計算とは


• 「関数」をより抽象的に扱う
関数
• 「箱」(ブラックボックス)
• 入力(引数)があって、出力(結果)がある

         f(x)
ラムダ記法
要するに

• λ[入力].[出力]
• なぜ「抽象的」と言えるのか?
 • = どこがええのんや
抽象化①
• 無名関数
 • いちいち名前を付けない

       λx. x+2
抽象化②


• 高階関数
 • 関数そのものを入力 / 出力できる
例えば、
• f(x, y) = x を考える (図はイメージ)
 • ラムダ記法では?

             f
答え


λx. (λy.x)
λx. (λy.x)

      •Pythonコード
      •f1 と f2 は同じ
カリー化


• f(x, y) = x → f(x)(y) = x
• これをカリー化と言います
ラムダ記法では


• カリー化した関数を簡潔に表せる
 • λx.(λy.x) で事足りる
でっていう


• カリー化して何が嬉しいのか
• めんどいだけなのでは...
嬉しいです
•   f(x, y) = x

    • … x と y の両方を渡す必要がある
• f(x)(y) = x
 • … x だけ渡す、という操作が可能
• この操作を部分適用と言う
ついでに

• λx. (λy. x) は λx. λy. x と表せる
 • どこがどの関数か自明
• λx. λy. x は λxy. x と表せる
 • ただの省略記法
SKIコンビネータ

• S = λx y z. x z (y z)
• K = λx y. x
• I = λx. x
I コンビネータ

• λx. x
• Identity combinator (恒等関数)
• 取ったのをそのまま返すだけ
Kコンビネータ

• λx y. x
• Constant combinator
• Konstant (独)
• 定数関数
Sコンビネータ
• λx y z. x z (y z)
• Sharing combinator
 • z をシェアする
 • S (λa. M) (λb. N) = λz. M N
   • ただし M = M[a:=z], N = N[b:=z]
データ型の表現
基本的な考え方

• Turing: 関数をデータで表現する
 • → 手続き型
• Church: データを関数で表現する
 • → 関数型
Church encoding


• データ型をラムダ計算でエンコード
 • 自然数、真偽値、コンテナ、...etc.
自然数 (Church)

• いわゆるチャーチ数
• ペアノの公理系に基づいて構成
• 1 := suc(0), 2 := suc(suc(0)), ...
具体的には
• 0 := λs z. z
• 1 := λs z. s z
• 2 := λs z. s (s z)
• 3 := λs z. s (s (s z))
• ...
Boolean

• True := λt f. t
• False := λt f. f
• if t1 then t2 else t3 := t1 t2 t3
Tuple

• (t1, t2) := λx. x t1 t2
• fst := λt. t (λf s. f)
• snd := λt. t (λf s. s)
List (Church)

• cons と nil で表現
• [x,y,z]
• = (cons x (cons y (cons z nil)))
List (Church)


• Nil := λc n. n
• Cons := λh t c n. c h (t c n)
List (Church)
• [x,y,z]
• =λc n. c x(λc n. c y(λc n. c z n))
• cons が foldr 的に振る舞う!
 • foldr = λn c l. l c n
   • tail = λl. l (λx xs. xs) Nil
Scott encoding


• もう一つのエンコーディング
• Lazy Kのリストは Scott encoding
自然数 (Scott)
• 0 := λz s. z
• 1 := λz s. s 0
• 2 := λz s. s 1
• 3 := λz s. s 2
• ...
List (Scott)


• Nil = λf g. f
• Cons = λx xs f g. g x xs
List (Scott)

• [x,y,z]
• = λc. c x (λc. c y (λc. (c z) Nil))
 • consはパターンマッチ的!
まとめ
• Scott encoding
 • プログラミングが簡単
 • パターンマッチ
• Church encoding
 • 再帰が簡単、計算量
Any questions?

Weitere ähnliche Inhalte

Was ist angesagt?

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzzConstexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
 

Was ist angesagt? (20)

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
Topological sort
Topological sortTopological sort
Topological sort
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzzConstexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 
ホモトピー型理論入門
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
 
グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜グラフネットワーク〜フロー&カット〜
グラフネットワーク〜フロー&カット〜
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 

Ähnlich wie ラムダ計算入門

12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
Haruka Ozaki
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料
Hiromasa Ohashi
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
 

Ähnlich wie ラムダ計算入門 (18)

(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
 
Lisp講義1
Lisp講義1Lisp講義1
Lisp講義1
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料すごいHaskell読書会 第六章 発表資料
すごいHaskell読書会 第六章 発表資料
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
 
1+1=2の話
1+1=2の話1+1=2の話
1+1=2の話
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
Pythonintro
PythonintroPythonintro
Pythonintro
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
Haskell勉強会 in ie
Haskell勉強会 in ieHaskell勉強会 in ie
Haskell勉強会 in ie
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
秘密分散法の数理
秘密分散法の数理秘密分散法の数理
秘密分散法の数理
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
Python勉強会3-コレクションとファイル
Python勉強会3-コレクションとファイルPython勉強会3-コレクションとファイル
Python勉強会3-コレクションとファイル
 

Mehr von Eita Sugimoto (10)

型推論
型推論型推論
型推論
 
電源2
電源2電源2
電源2
 
Semiotics
SemioticsSemiotics
Semiotics
 
電源
電源電源
電源
 
Lecture4
Lecture4Lecture4
Lecture4
 
Lecture3
Lecture3Lecture3
Lecture3
 
Lecture2
Lecture2Lecture2
Lecture2
 
Lecture1
Lecture1Lecture1
Lecture1
 
Summer seminar
Summer seminarSummer seminar
Summer seminar
 
Functional Pearl + Brainfuck
Functional Pearl + BrainfuckFunctional Pearl + Brainfuck
Functional Pearl + Brainfuck
 

ラムダ計算入門

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n