好的,所以我花了很多时间在这上面,我似乎无法掌握如何做到这一点。当它是一个简单的变量时,我确实理解了它,但似乎无法用相同的概念来理解一个更复杂的问题。
这是我理解的一个简单的:
(define (add n)
(lambda (x) (+ x n)))
(define total (add 5))
(total 12) => **17**
这就是我想要实现的,当输入一个整数时它应该找到该位置的值,我有找到位置的函数但不知道如何将这个实现到返回的函数中功能方式:
(define (position N L)
(cond ((null? L) L)
((= N 1) (car L))
(else (position (- N 1) (cdr L)))))
例如,如果我输入(define X (position '(1 5 8 2 7)))
然后输入(X 4)
,则应输出位于#4的2
。我确定它很简单,但我已经坐了一会儿尝试把它放在一起,但我做得还不好。任何帮助表示赞赏!
答案 0 :(得分:3)
最简单的方法是创建第二个程序:
(define (position L N)
(cond ((null? L) L)
((= N 1) (car L))
(else (position (cdr L) (- N 1)))))
(define (position2 L)
(lambda (N)
(position L N)))
然后
> (define X (position2 '(1 5 8 2 7)))
> (X 4)
2
在Racket中,您还可以使用curry
:
> (define x (curry position '(1 5 8 2 7)))
> (x 4)
2
答案 1 :(得分:3)
正如uselpa所说,你可以通过定义第二个过程来做到这一点,但这是一个相当简单的实现,所以你可以这样做:
(define (position L)
(lambda (N)
(cond ((null? L) '())
((= N 1) (car L))
(else ((position (cdr L)) (- N 1))))))
(define X (position '(1 5 8 2 7)))
此处,X被定义为#<procedure>
绑定到函数position
,列表为L
。在else
语句中,您看到(position (cdr L))
等同于X
,我们跟随(- N 1)
。