我有curry
函数:
(define curry
(lambda (f) (lambda (a) (lambda (b) (f a b)))))
我认为这就像(define curry (f a b))
。
我的任务是使用consElem2All
编写一个函数curry
,它应该像
(((consElem2All cons) 'b) '((1) (2 3) (4)))
>((b 1) (b 2 3) (b 4))
我已经定期写了这个函数:
(define (consElem2All0 x lst)
(map (lambda (elem) (cons x elem)) lst))
但仍然不知道如何使用curry
对其进行转换。任何人都可以帮助我吗?
提前致谢
bearzk
答案 0 :(得分:4)
你应该首先阅读关于currying的内容。如果你不明白咖喱是什么,可能真的很难用它...在你的情况下,http://www.engr.uconn.edu/~jeffm/Papers/curry.html可能是一个好的开始。
currying的一个非常常见和有趣的用法是使用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))))))
然后是一些数学函数:
(define mult (curry2 *))
(define double (mult 2))
(define add (curry2 +))
(define increment (add 1))
(define decrement (add -1))
然后来了curried的reduce / map:
(define creduce (curry3 reduce))
(define cmap (curry2 map))
首先减少用例:
(define sum ((creduce +) 0))
(sum '(1 2 3 4)) => 10
(define product (creduce * 1))
(product '(1 2 3 4)) => 24
然后映射用例:
(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)
我希望这有助于你掌握currying的用处......
答案 1 :(得分:1)
所以你的咖喱版本需要一个带有两个参数的函数,让我们说:
(define (cons a b) ...)
并将其变成你可以这样称呼的东西:
(define my-cons (curry cons))
((my-cons 'a) '(b c)) ; => (cons 'a '(b c)) => '(a b c)
你实际上有一个需要三个args的函数。如果您拥有管理3-ary功能的curry3
,则可以执行以下操作:
(define (consElem2All0 the-conser x lst) ...)
(就像你一样,但允许使用除缺点之外的类似功能!)
然后执行此操作:
(define consElem2All (curry3 consElem2All0))
你手边没有这样的curry3
。因此,您可以构建一个,或者通过“手动”自己调整额外变量来解决它。解决它看起来像:
(define (consElem2All0 the-conser)
(lambda (x lst) ...something using the-conser...))
(define (consElem2All the-conser)
(curry (consElem2All0 the-conser)))
请注意,在地图表达式本身中还有另外一种可能的咖喱用法,这意味着你将一个lambda包裹在cons周围以将元素传递给cons。你怎么能把x
加入cons
以便你得到一个可以直接用于映射的单参数函数?...
答案 2 :(得分:-1)
(define (consElem2All0 x lst)
(map ((curry cons) x) lst))