【问题标题】:Scheme, higher order functions, and curried functionsScheme、高阶函数和柯里化函数
【发布时间】:2016-06-17 20:16:41
【问题描述】:

我需要编写一个Scheme高阶函数,它以一个有两个参数的函数作为参数,并返回该函数的柯里化版本。到目前为止,我在柯里化函数方面了解很多:

(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 高阶函数的问题。我如何将这些概念联系在一起?提前谢谢你,我真的很感激。

【问题讨论】:

    标签: scheme higher-order-functions currying


    【解决方案1】:

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

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

    函数curry 接受函数f 并返回一个带有单个参数x 的函数。 那个函数,给定一个参数值,返回另一个函数,它接受一个参数y,并返回将原始函数f应用到xy的结果。因此,例如,(curry +) 返回 + 的柯里化版本:

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

    【讨论】:

    • 哇,Renzo,你提供的那个简单的例子太棒了!我已经坚持了几个小时,但你给了我顿悟。伦佐真是太感谢你了!
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2016-01-01
    • 1970-01-01
    • 2021-02-07
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多