在Scheme中对函数进行n次计算

时间:2012-11-25 15:48:13

标签: lambda scheme currying

我无法找到一种方法来指定一个指定次数的函数。也就是说,我给函数一个自然数n和一个函数乐趣,并且它将函数调整n次。例如:

(curry n fun)

该功能和可能的应用程序是:

(((((curry 4 +) 1) 2) 3) 4)

哪个会产生10个。

我真的不确定如何正确实施它。有人可以帮我一把吗?谢谢:))

2 个答案:

答案 0 :(得分:2)

您可以通过反复调用n-curry来编写自己的curry程序:

(define (n-curry n func)
  (let loop ([i 1] [acc func])
    (if (= i n)
        acc
        (loop (add1 i) (curry acc)))))

如果您使用的是Racket,使用for/fold迭代可以更简单地表达:

(define (n-curry n func)
  (for/fold ([acc func])
    ([i (in-range (sub1 n))])
    (curry acc)))

无论如何使用它:

(((((n-curry 4 +) 1) 2) 3) 4)
=> 10

答案 1 :(得分:2)

;;; no curry
;;; (Int, Int, Int) => Int

(define sum
  (lambda (x y z)
    (+ x y z) ) )

(sum 1 2 3)

;;; curry once
;;; (Int) => ((Int x Int) => Int)

(define sum
  (lambda (x)
    (lambda (y z)
      (+ x y z) ) ) )

(define sum+10 (sum 10))

(sum+10 10 20)

;;; curry 2 times
;;; (Int) => (Int => (Int => Int) )

(define sum
  (lambda (x)
    (lambda (y)
      (lambda (z)
        (+ x y z) ) ) ) )

(define sum+10+20 ((sum 10) 20))

(sum+10+20 30)

;;;现在我们将从这些例子开始概括:

(define (curry n f)
  (if (= n 0)
      (lambda (x) x)
      (lambda (x) (f ((curry (- n 1) f) x)))))

;;;示例:在初始数字10上应用函数1+的11倍,结果21:

((curry 11 (lambda (x) (+ x 1))) 10)