Function Scheme-有一个函数返回一个函数

Function Scheme-有一个函数返回一个函数,function,functional-programming,lisp,scheme,currying,Function,Functional Programming,Lisp,Scheme,Currying,我希望以以下方式使用此代码: 如果我进入: ((function1 5) 2) 其中,function1基于5执行其过程,并返回一个function2,该函数基于2执行某些操作。这可能吗 (define (multiplyBy n) (lambda (x) (* n x))) ((multiplyBy 5) 2) 我相信我会做你想做的事。继续@zebediah49的例子,这里有另一种方法: (define (multiplyBy n) ((curry *) n)) ((multiplyBy

我希望以以下方式使用此代码: 如果我进入:

((function1 5) 2)
其中,function1基于
5
执行其过程,并返回一个
function2
,该函数基于
2
执行某些操作。这可能吗

(define (multiplyBy n) (lambda (x) (* n x)))
((multiplyBy 5) 2)

我相信我会做你想做的事。

继续@zebediah49的例子,这里有另一种方法:

(define (multiplyBy n) ((curry *) n))
((multiplyBy 5) 2)
> 10
通常,对于双参数函数(上面的示例看起来有点不同,因为
*
是一个或多个参数函数):


我四处询问,我发现你可以定义这样一个函数:

(定义((函数1 arg0)arg1)(;此处的过程…)


这就是我想要的。我猜它并不是真的得到一个函数来返回一个过程,毕竟…:/谢谢你的帮助!:)

这些答案中的许多正确地显示了从函数返回函数的不同方式。更一般地说,你所做的是所谓的咖喱。更具体地说,“curry”指的是将接受n个参数的函数转换为接受一个参数的函数并返回接受n-1个参数的新函数的过程

对于一个初学的学生来说,以下是我觉得最好的风格:

#lang racket

;; a curried function that multiplies two numbers
(define (function1 arg0)
  (define (function2 arg1) 
    (* arg0 arg1))
  function2)
此函数接受一个参数(arg0),定义一个参数(arg1)的新函数,该参数将arg0和arg1相乘,然后返回它


这一个没有使用lambda的那个短,但是当你刚开始的时候,lambda看起来可能只是一个更奇怪的东西,没有意义

实际上,您编写的是一个返回函数的函数。尝试仅使用一个参数调用function1。你应该看到你回来了。。。一个函数!所以实际上,有很多方法可以从函数返回函数。另一方面,请参见下面我的答案…
(define((function1arg0)arg1))
(define(function1arg0)(lambda(arg1)))的语法糖。
,两个版本都是相同的。我想这与zebediah的答案相同,但正如Oscar所说,在语法上是不同的。谢谢大家的帮助!:)这种技术叫什么?你能给我指一下书中描述的地方吗?我搜索了“高阶函数”和“curried函数”(这就是我听到的描述),但我找不到文档中使用的语言。我不确定它的正式名称是什么——它或多或少是
11.2.1
11.4.2
部分的扩展<代码>(定义)[3rd form]为变量名指定一些形式和主体;主体恰好是一个返回函数的lambda表达式。lambda部分指定“计算lambda表达式时有效的环境将作为过程的一部分被记住”。这意味着在执行时,首先使用参数对
define
'd变量进行求值,然后将其传递到lamba的环境中(保存在结果过程中)。
(define ((function1 arg0) arg1) <body>)
(define (function1 arg0) (lambda (arg1) <body>))
(define (function1 arg0) (curry <function2, receives arg1> arg0))
(define (function1 arg0) (define (function2 arg1) <body>) function2)
#lang racket

;; a curried function that multiplies two numbers
(define (function1 arg0)
  (define (function2 arg1) 
    (* arg0 arg1))
  function2)