理系学生日記

おまえはいつまで学生気分なのか

λ計算はちかくてとおい

そろそろλ計算にはいりたいなーと思ってたのに、読むだけでおわった。

問1.32

sum(Σ)とproduct(Π)は2箇所しか変えなくていいという問1.31の答えは,二つが同じ構造をもっていることを意味しているということで、んじゃ、その同じ構造をくくりだしてみようというテスト。

(define (accumulate combiner null-value term a next b)
  (if (<= a b) 
      (accumulate combiner (combiner null-value (term a)) term (next a) next b)
      null-value))

そうすると、sumやproductはたとえば以下のようにかける。

(print (accumulate + 0 self 0 inc 10))
(print (accumulate * 1 self 1 inc 6))

問1.34

(define (f g) (g 2))

というプログラムがあるときに

(f f)

とすると何が起きるんだろうというお話。なんかぜんぜんわかんない。実際にやってみたら

$ gosh problem1-34.scm
gosh: "error": invalid application: (2 2)

ていうエラーになる。あれ、fが2になってるんだよなこれ。はて、どういうことか。
(f f)とした時点で、f=gが確定して、(f g)は(g 2)でbindされているから、(f 2)。fは(f g)=(f f)なのでf=2になって(2 2)?書いててもいみがわからない。