【问题标题】:How to create a make-curry function like racket has如何创建像球拍一样的make-curry功能
【发布时间】:2021-09-01 19:03:22
【问题描述】:

我想看看如何模拟racket 提供的(curry func)。这是我如何手动对函数进行柯里化的示例:

#lang sicp
; convert to a curried function

(define (add1 x y) (+ x y))

(define add2
  (lambda (x)
    (lambda (y)
      (+ x y))))
(add1 2 3)
; 5

((add2 2) 3)
; 5

我会从哪里开始添加一个高阶函数,以便将“普通”函数转换为柯里化函数,如下所示:

(((curry add1) 2) 3)

【问题讨论】:

    标签: scheme lisp racket currying sicp


    【解决方案1】:

    您必须做出一些权衡,因为要判断一个函数接受多少个参数并不容易。 Racket 有一个procedure-arity 函数,可以让curry 告诉 curry 有多少个参数,但 SICP 语言没有。所以你必须选择如何处理这个问题。一些合理的选择包括:

    • 让调用者指定等待多少参数
    • 仅使用固定数量的参数
    • 仅对函数的前 n 个调用进行柯里化,并通过底层函数进行第 n+1 个调用。

    【讨论】:

    • 我明白了,所以如果调用者指定了参数的数量(比如说,两个)或者它被固定在某个值(也可能是两个),那么这可能是如何工作的一个例子?跨度>
    • 修复为 2 非常简单。就像你写 add1 一样写它,但不是硬编码 +,而是使用另一个将 f 作为参数的 lambda。
    • 啊,我明白了,是的,这很容易。 #1 会怎么样?
    • 尝试自己解决。显然,该函数将一个 int 和一个函数作为参数,如果 int 为零,它就可以返回该函数。对于非零 int,它显然会返回一些其他函数,并且该函数可能会使用较小的 int 调用 curry 本身。
    • 感谢您的鼓励和提示,是的,我会尝试解决这个问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多