2010/04/24

部分適用, 関数合成

cutとcompose 良い。
;; cut, compose
(use srfi-1)
(define (make-fizzbuzz min max)
(map (lambda (n)
(let ((p (compose zero? (cut modulo n <>))))
(cond ((p 15) "fizzbuzz")
((p 5) "buzz")
((p 3) "fizz")
(else n))))
(iota max min)))
(define (fizzbuzz)
(make-fizzbuzz 1 100))
(display (fizzbuzz))
view raw compose-cut.scm hosted with ❤ by GitHub

関係ないけどfold-right。
;; fold-right
(display
(fold-right (lambda (e acc)
(let ((p (compose zero? (cut modulo e <>))))
(cons (cond ((p 15) "fizzbuzz")
((p 5) "buzz")
((p 3) "fizz")
(else e)) acc)))
'() (iota 100 1)))
view raw temp.scm hosted with ❤ by GitHub

確かsicpの2章にcomposeと一緒にrepeatedってのが出てたような。
ところでsicpって「シックピー(sick-pea)」と読むらしいですね。srfi同様「えすあいしーぴー」って読んでました。
;; repeated
(define (repeated n f)
(lambda (x)
(if (zero? n)
x
((repeated (- n 1) f)(f x)))))
((repeated 3 (lambda (x)
(* x 3))) 3)
; -> 81
((repeated 3 (cut * <> 3)) 3)
; -> 81
(define (repeated n f)
(lambda (x)
(letrec ((rep (lambda (n acc)
(if (zero? n)
(acc x)
(rep (- n 1)
(lambda (y)
(f (acc y))))))))
(rep n identity))))
((repeated 5 (cut * <> 2)) 2)
; -> 64
(define (repeated n f)
(lambda (x)
(let loop ((n n)
(acc identity))
(if (zero? n)
(acc x)
(loop (- n 1)
(lambda (y)
(f (acc y))))))))
((repeated 5 (cut * <> 2)) 2)
; -> 64
view raw repeated.scm hosted with ❤ by GitHub

一般的な再帰からnamed-letに書き直せない病。(letrecを経由するといける)

プログラミングGauche計算機プログラムの構造と解釈

0 件のコメント:

コメントを投稿