SlideShare a Scribd company logo
1 of 38
(define)を使わずに再帰関数を書く
関数型LT大会 #functionalLT
2014-05-11 @ クックパッド
κeen(@blackenedgold)
自己紹介
● Twitter: κeen(@blackenedgold)
● Github: KeenS
● ブログ: κeenのHappy Hacκing Blog
(KeenS.github.io)
● Shibuya.lispにいます
● 東大数学科の4年生
● Lisp, Ruby, OCaml, シェルスクリプトなど
そろそろ終盤ですね。
皆さんお疲れ様です。
私はそんなに恐い話はしないので
気楽に聴いて下さい
突然ですが
再帰関数書けますか?
(define fact
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
defineなしだと?
( fact
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
…つらい
もうちょっと言うと
lambda, if, +, -, *, =
だけで書いてみて下さい
(define var value)
≒ (let ((var value)) …)
≒ ((lambda (var) …) value)
ところ
で
一番下のやつはJavaScriptでは良く使いますね
((lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
□□□)
置き換えてみ
る
((lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
□□□)
ここに入るもの
置き換えてみ
る
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))
もちろん、fact本
体。
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))
もちろん、fact本
体。
あ
れ?
((lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
□□□)
でも何かしらの値を与えれ
ば本体は取り出せる
((lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
□□□)
ここに入るもの
でも何かしらの値を与えれ
ば本体は取り出せる
またfact …本体が必要になったぞ ?
(再帰関数だから当たり前)
一旦状況を整理しよう
((lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))
□□□)
ここに入るもの
元々の問題
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))) = f とおく
と
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))) = f とおく
と
Fact = (f □□□)
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))) = f とおく
と
Fact = (f □□□)
□□□ = (f □□□)
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))) = f とおく
と
Fact = (f □□□)
□□□ = (f □□□)
つまり
(f (f (f … )))
つまり
(f (f (f … )))
無限回適用
あ、fは
「1引数を取って1引数関数を返す関
数」
ってのを覚えておいて下さい
((lambda (x) (x x)) (lambda (x) (x x)))
ところで
このquin知ってますか?
((lambda (x) (x x)) (lambda (x) (x x)))
ところで
このquin知ってますか?
((lambda (x) (x x)) (lambda (x) (x x)))
ところで
このquin知ってますか?
無限ループが起きる
(lambda (f)
((lambda (x) (f (x x))) (lambda (x) (f (x x)))))
”うまいこと無限ループの エンジン”
に関数適用を乗せてみる
(f (f (f … (f (x x))...)))
”でもまだ エンジン”が暴走するので
thunkで包んであげる
(lambda (f)
((lambda (x) (f (lambda () (x x))))
(lambda (x) (f (lambda () (x x))))))
ところでfは
「1引数を取って1引数関数を返す関数」
でした。
引数のnを与えましょう
(lambda (f)
((lambda (x) (f (lambda (n) ((x x) n)))
(lambda (x) (f (lambda (n) ((x x) n))))))
完成!
((lambda (f)
((lambda (x) (f (lambda (n) ((x x) n))))
(lambda (x) (f (lambda (n) ((x x) n))))))
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1)))))))
全体図
(((lambda (f)
((lambda (x) (f (lambda (n) ((x x) n))))
(lambda (x) (f (lambda (n) ((x x) n))))))
(lambda (fact)
(lambda (n)
(if (= 0 n)
1
(* n (fact (- n 1))))))) 10)
* * * * * * * => 3628800
遊んでみる
(picrinで実行)
今日のキーワード
● λ計算
● ω関数
● 不動点コンビネータ
● Thunk
● Scheme
● Picrin
● Lisp
● Shibuya.lisp
以上
質問あればどうぞ
Shibuya.lispについてちょっと宣伝
● 毎月の下旬に開催されるLTスタイルの勉強会
● 一応Common Lisp回、Scheme回、Clojure回が
ある
● でもLispに関係してればなんでもOK
● 今月はScheme回
● 今回は処理系実装者が数名(1人以上)来るよ
うです

More Related Content

What's hot

並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
Hiro H.
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
Shinta Hatatani
 

What's hot (20)

Introduction to Categorical Programming
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical Programming
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)Rubyの御先祖CLUのお話(原本)
Rubyの御先祖CLUのお話(原本)
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみよう
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Freer Monads, More Extensible Effects
Freer Monads, More Extensible EffectsFreer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 

Similar to (define)なしで再帰関数を定義する

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
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
mozk_
 
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
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
Naoki Kitora
 

Similar to (define)なしで再帰関数を定義する (20)

Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Lispでやる記号微分
Lispでやる記号微分Lispでやる記号微分
Lispでやる記号微分
 
Incanterの紹介
Incanterの紹介Incanterの紹介
Incanterの紹介
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
Material
MaterialMaterial
Material
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
 
120919 kyushu
120919 kyushu120919 kyushu
120919 kyushu
 
Lisp study
Lisp studyLisp study
Lisp study
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
SICP
SICPSICP
SICP
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 

Recently uploaded

Recently uploaded (8)

Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアルLoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
LoRaWAN無位置ロープ式水漏れセンサーWL03A 日本語マニュアル
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 

(define)なしで再帰関数を定義する