我正在为我的CS课程编写一个作业。我必须根据另一个名为chili的函数编写一个n-ary函数,它接受3个参数和一个运算符作为输入,并返回与运算符结合的变量,如下所示:
> ((((Chili3 +) 1) 10) 100)
111
代码:
(define Chili3
(lambda (p)
(lambda (x1)
(lambda (x2)
(lambda (x3)
(p x1 x2 x3))))))
我应该写的功能必须采取另一个输入,该输入定义了函数将使用的参数数量,并将如下所示:
> ((((((Curry 5 *) 1) 2) 3) 4) 5)
120
这是我到目前为止的代码:
(define Chili
(lambda (n p)
(lambda(xs)
((p n) xs))))
有人可以帮助我,也许只是解释n-ary函数是如何工作的,或者我的代码有什么问题?
答案 0 :(得分:2)
这是我的看法。
(define (curry-n n proc)
(let curry-n-aux ((n n) (args '()))
(if (zero? n)
(apply proc (reverse args))
(lambda (x)
(curry-n-aux (- n 1) (cons x args))))))
(curry-n 0 (lambda () "hello")) ; ==> "hello"
((curry-n 1 values) "hello") ; ==> "hello"
((((((curry-n 5 *) 1) 2) 3) 4) 5); ==> 120
另一种方法是使用适用的特殊“应用”值:
(define %curry-apply (list 'apply))
(define (curry proc)
(let curry-n-aux ((args '()))
(lambda (x)
(if (eq? x %curry-apply)
(apply proc (reverse args))
(curry-n-aux (cons x args))))))
((curry-n (lambda () "hello")) %curry-apply) ; ==> "hello"
(((curry-n values) "hello") %curry-apply) ; ==> "hello"
(((((((curry-n *) 1) 2) 3) 4) 5) %curry-apply); ==> 120
答案 1 :(得分:1)
这是一个带有任意数量参数的简单函数。 该点表示它是一个n元函数。
(define (plus . xs)
(define n (length xs))
(display "The number of arguments were: ")
(display n)
(newline)
(apply + xs))
(plus)
(plus 1)
(plus 1 2)
(plus 1 2 3)