(define (repeated f n)
(lambda (x)
(let recur ((x x) (n n))
(if (= n 0)
args
(recur (f x) (sub1 n))))))
引数が 2 段階で渡されることを除いて、通常どおりに関数を記述します。次のように定義すると、さらに明確になる可能性がありますrepeated
。
(define repeated (lambda (f n) (lambda (x)
(define (recur x n)
(if (= n 0)
x
(recur (f x) (sub1 n))))
(recur x n))))
このように 'let-loop' を使用する必要はありません。また、ラムダにより、引数が 2 段階であると予想されることが明らかになります。(注: recur は Clojure のように Scheme に組み込まれていません。名前が気に入っています)
> (define foonly (repeat sub1 10))
> (foonly 11)
1
> (foonly 9)
-1
ここで必要なクールな機能は、コンポジションではなくカリー化です。暗黙のカリー化を行う Haskell は次のとおりです。
repeated _ 0 x = x
repeated f n x = repeated f (pred n) (f x)
これが宿題の問題ではないことを願っています。