SICP問題2.6のおまけ

問題2.6では加算までだったが、 Web で他の人のを見たら加減乗除全て実装していたので確認してみる。

まずは、乗算。

(define (church* m n)
  (lambda (f) (lambda (x) ((m (n f)) x))))

と思ったけど、引き算の想像がつかない
Web の他人のを見ると-1する関数を作成して、それを適用するみたいなんだけど、ソース見た感じで動かないと思ったら、やっぱり動かなかった…。
ということで以降は中止。

あ、でもべき乗はやっとけ、ということなので、べき乗はやってみる。
m の0, 1, 2, 3 乗 は以下のようになる

(lambda (x) (x))
(lambda (x) ((m f) x))
(lambda (x) ((m (m f)) x))
(lambda (x) ((m (m (m f))) x))

ので、べき乗部分はこんな感じかな

(lambda (f) (lambda (x) ((n (lambda (x) (m f))) x)))

ということで、定義。

(define (church-power m n)
  (lambda (f) (lambda (x) ((n (lambda (x) (m f))) x)))
)

確認。

(church-to-int (church-power one two))
; #<closure (one one)>
(church-to-int (church-power two three))
; #<closure (two two)>

が、うまくいかない。のでカンニング。むー。奥が深い。と思ったが問題1.41のdoubleと同じ話だよね。

(define (church-power m n)
  (lambda (f) ((n m) f))
)

確認

(church-to-int (church-power zero zero))
; 1
(church-to-int (church-power zero one))
; 0
(church-to-int (church-power zero two))
; 0
(church-to-int (church-power one two))
; 1 
(church-to-int (church-power two zero))
; 1
(church-to-int (church-power two one))
; 2
(church-to-int (church-power two two))
; 4
(church-to-int (church-power two three))
; 8

OK