SICPを読む(23) 1.3.2(2) ラムダについて

Schemeは怪しげな新興宗教に近いと思う今日この頃です。Schemeを操る人々には何かが憑いている。

何かが知りたいので、僕も入信しちゃいますよ。

・・・ガクガク震えながら怪しげな新興宗教「λ教」の扉を開いた。


って事で、λについて調べた。

まず、意味不明な記号について。

こんなのを発明した人物は・・・

ラムダ計算とは?

90%位意味不明ですが、これから100%読めるようにしていきます。

ガンバリマス。

大体概要が掴めてきたので、

コーディングに入ります。

まず、簡単なのからいこう。

\sum_{x=a}^b x

簡単。Σは単なる「たしざん」ですよ。

; 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を使うことで式が随分すっきりしました。

関数渡しを使うことで、プログラムの表現の幅が何倍、何百倍にも広がっていきます。

今日からλ教入信です。