我有这个curry功能:
(define curry
(lambda (f) (lambda (a) (lambda (b) (f a b)))))
Run Code Online (Sandbox Code Playgroud)
我想就是这样(define curry (f a b)).
我的任务是编写一个函数consElem2All使用curry,它应该像
(((consElem2All cons) 'b) '((1) (2 3) (4)))
>((b 1) (b 2 3) (b 4))
Run Code Online (Sandbox Code Playgroud)
我已经定期编写了这个函数:
(define (consElem2All0 x lst)
(map (lambda (elem) (cons x elem)) lst))
Run Code Online (Sandbox Code Playgroud)
但仍然不知道如何改造它curry.谁能帮我?
提前致谢
bearzk
您应该首先阅读有关柯里化的内容。如果你不明白咖喱是什么,可能真的很难使用它......就你而言,http://www.engr.uconn.edu/~jeffm/Papers/curry.html可能是一个不错的选择开始。
柯里化的一种非常常见和有趣的用途是使用像reduce或map这样的函数(对于它们自己或它们的参数)。
(define curry2 (lambda (f) (lambda (arg1) (lambda (arg2) (f arg1 arg2)))))
(define curry3 (lambda (f) (lambda (arg1) (lambda (arg2) (lambda (arg3) (f arg1 arg2 arg3))))))
Run Code Online (Sandbox Code Playgroud)
然后是一些柯里化的数学函数:
(define mult (curry2 *))
(define double (mult 2))
(define add (curry2 +))
(define increment (add 1))
(define decrement (add -1))
Run Code Online (Sandbox Code Playgroud)
然后是柯里化的reduce/map:
(define creduce (curry3 reduce))
(define cmap (curry2 map))
Run Code Online (Sandbox Code Playgroud)
首先减少用例:
(define sum ((creduce +) 0))
(sum '(1 2 3 4)) ; => 10
(define product (creduce * 1))
(product '(1 2 3 4)) ; => 24
Run Code Online (Sandbox Code Playgroud)
然后映射用例:
(define doubles (cmap double))
(doubles '(1 2 3 4)) ; => (2 4 6 8)
(define bump (cmap increment))
(bump '(1 2 3 4)) ; => (2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助您掌握柯里化的用处......