SICPを読む(23) 1.3.2(2) ラムダについて
Schemeは怪しげな新興宗教に近いと思う今日この頃です。Schemeを操る人々には何かが憑いている。
何かが知りたいので、僕も入信しちゃいますよ。
・・・ガクガク震えながら怪しげな新興宗教「λ教」の扉を開いた。
って事で、λについて調べた。
まず、意味不明な記号について。
- ギリシア文字 - Wikipedia
- λはギリシャ文字Λラムダの小文字。
- Λ - Wikipedia
- JΛL(日本航空)はλ教のメンバーだった!!(驚
こんなのを発明した人物は・・・
- アロンゾ・チャーチ - Wikipedia
- スティーヴン・コール・クリーネ - Wikipedia
- 正規表現の発明者でもある。すげぇ
大体概要が掴めてきたので、
コーディングに入ります。
まず、簡単なのからいこう。
簡単。Σは単なる「たしざん」ですよ。
; 1から10まで足す。 (define (sum-integers a b) (sum (lambda (x) x) a (lambda (x) (+ x 1)) b)) (sum-integers 1 10)
答えは55。
lambda自体はそんなに難しくないと思う。単なる無名関数。
理解しづらいのが「関数渡し」というスタイル。
これこそλの世界であり、関数型言語の特徴だと思う。
では、π/8を求めよう。
; piの計算 (define (pi-sum a b) (sum (lambda (x) (/ 1.0 (* x (+ x 2)))) a (lambda (x) (+ x 4)) b)) (* 8 (pi-sum 1 1000))
π/4の式を変形すると、この式になるけど、案外トリッキーな技だと思う。しばらく考えてしまった。ちなみに、1000回やってもあまり良い値にはならない。
次は、積分の抽象化
; 積分の抽象 (define (integral f a b dx) (* (sum f (+ a (/ dx 2.0)) (lambda (x) (+ x dx)) b) dx)) (integral (lambda (x) x) 0 1 0.01) (integral (lambda (x) (* x x)) 0 1 0.01) (integral (lambda (x) (* x x x)) 0 1 0.01)
lambdaを使うことで式が随分すっきりしました。
関数渡しを使うことで、プログラムの表現の幅が何倍、何百倍にも広がっていきます。
今日からλ教入信です。