咖喱计划

时间:2011-06-26 22:21:02

标签: scheme currying

我有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

3 个答案:

答案 0 :(得分:4)

你应该首先阅读关于currying的内容。如果你不明白咖喱是什么,可能真的很难用它...在你的情况下,http://www.engr.uconn.edu/~jeffm/Papers/curry.html可能是一个好的开始。

currying的一个非常常见和有趣的用法是使用reduce或map(为自己或他们的参数)等函数。

让我们定义两个currying运算符!

(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))