Scheme,高阶函数和curried函数

时间:2016-03-04 07:20:23

标签: scheme higher-order-functions currying

我需要编写一个Scheme高阶函数,它将两个参数的函数作为参数,并返回函数的curried版本。到目前为止,我对这些功能非常了解:

(define curriedFunction (lambda (x) 
        (if (positive? x)
            (lambda (y z) (+ x y z))
            (lambda (y z) (- x y z)))))

(display ((curriedFunction -5) 4 7))
(display "\n")
(display ((curriedFunction 5) 4 7))

如果x为负,则减去x y和z。如果x为正,则添加x,y和z。

就高阶函数而言,我理解这一点:

(display (map (lambda (x y) (* x y)) '(1 2 3) '(3 4 5)))

第三,我在将函数作为参数传递方面理解这一点:

(define (function0 func x y)
        (func x y))

(define myFunction (lambda (x y)
        (* x y)))

(display (function0 myFunction 10 4))

在上面的代码中,我理解了函数" myFunction"也可以写成:

(define (myFunction x y)
        (* x y))

所以现在你知道我在Scheme编程和语法方面的位置。 现在回到回答编写一个Scheme高阶函数的问题,该函数将两个参数的函数作为其参数并返回该函数的curried版本。如何将这些概念连接在一起?提前谢谢你,我真的很感激。

1 个答案:

答案 0 :(得分:4)

这是一个可能的解决方案:

(define (curry f)
  (lambda (x)
    (lambda (y)
      (f x y))))

函数curry接受函数f并返回一个带有单个参数x的函数。 函数,给定其参数的值,返回另一个带有参数y的函数,并返回将原始函数f应用于x的结果, y。因此,例如,(curry +)会返回+的咖喱版:

(((curry +) 3) 4)  ;  produces 7