如何创建像球拍一样的制作咖喱功能
How to create a make-curry function like racket has
我想看看如何模拟 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
我从哪里开始添加高阶函数,以便将 'normal' 函数转换为柯里化函数,如下所示:
(((curry add1) 2) 3)
您必须做出一些权衡,因为判断一个函数接受多少参数并不容易。 Racket 有一个 procedure-arity
函数让 curry
告诉 curry 有多少参数,但 SICP 语言没有。所以你必须选择如何处理这个。一些合理的选择包括:
- 让调用者指定要等待的参数数量
- 仅使用固定数量的参数
- 仅对函数的第一个 n 调用进行柯里化,并通过基础函数进行第 n+1 次调用。
我想看看如何模拟 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
我从哪里开始添加高阶函数,以便将 'normal' 函数转换为柯里化函数,如下所示:
(((curry add1) 2) 3)
您必须做出一些权衡,因为判断一个函数接受多少参数并不容易。 Racket 有一个 procedure-arity
函数让 curry
告诉 curry 有多少参数,但 SICP 语言没有。所以你必须选择如何处理这个。一些合理的选择包括:
- 让调用者指定要等待的参数数量
- 仅使用固定数量的参数
- 仅对函数的第一个 n 调用进行柯里化,并通过基础函数进行第 n+1 次调用。