我无法找到一种方法来将函数咖喱指定次数。也就是说,我给函数一个自然数n和一个函数fun,它对函数进行了n次curry。例如:
(curry n fun)
功能和可能的应用是:
(((((curry 4 +) 1) 2) 3) 4)
这将产生 10 个。
我真的不确定如何正确实施它。有人可以帮帮我吗?谢谢 :)
;;; 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)))))
1+
;;;示例:对初始数字 10应用 11 次函数,结果为 21:
((curry 11 (lambda (x) (+ x 1))) 10)
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