函数型言語とは

  • 繰り返し処理を定義する
(define zero (lambda (s) (lambda (z) z)))
(define one  (lambda (s) (lambda (z) (s z))))
(define two  (lambda (s) (lambda (z) (s(s z)))))
(define three (lambda (s) (lambda (z) (s(s(s z))))))
  • 0にadd1を2回適用する
((two add1) 0)
  • 繰り返し処理の別定義
(define compose
 (lambda (f g)
  (lambda (x) (f (g x)))))
(define repeated
 (lambda (f n)
  (if (zero? n)
   (lambda (x) x)
   (compose f (repeated f (-- n))) )))
((repeated add1 7) 3)
  • 自然数を0から作る。「1段階上げる」という操作だけでそうする
(define Succ
 (lambda (v) (lambda (s) (lambda (z)
  (s ((v s) z)) ))))
> ((two add1) 0)
2
> (((Succ two) add1) 0)
3
> (((Succ one) add1) 0)
2
> (((Succ zero) add1) 0)
1
> (((Succ (Succ zero)) add1) 0)
2
  • add1という処理を「2回やる」と「3回やる」との加算
(define Plus
 (lambda (u v) (lambda (s) (lambda (z)
  ((u s) ((v s) z)) ))))
> (((Plus two three) add1) 0)
5