我想以下列方式使用此代码: 如果我输入:
((function1 5) 2)
其中function1基于5
执行其过程,并返回基于function2
执行某事的2
。这可能吗?
答案 0 :(得分:10)
(define (multiplyBy n) (lambda (x) (* n x)))
((multiplyBy 5) 2)
我相信你会做你想做的事。
答案 1 :(得分:1)
继续@ zebediah49的例子,这是另一种方法:
(define (multiplyBy n) ((curry *) n))
((multiplyBy 5) 2)
> 10
通常,对于双参数函数(上面的示例看起来有点不同,因为*
是一个或多个参数函数):
(define (function1 arg0) (curry <function2, receives arg1> arg0))
引用curry
程序的文档:
返回
proc
的curried版本的过程。首次应用生成的过程时,除非给出它可以接受的最大参数数,否则结果是接受其他参数的过程
基本上,您被要求实施currying。引用维基百科文章:
在数学和计算机科学中,currying是一种转换函数的技术,该函数采用多个参数(或参数的n元组),使得它可以被称为一个函数链,每个参数都有一个参数(部分申请)。它起源于MosesSchönfinkel,后来由Haskell Curry重新发现。因此,有人说将其命名为schönfinkeling更为正确。
请注意,所有这些都是等效的:
(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)
答案 2 :(得分:1)
我四处询问,我发现你可以定义一个这样的函数:
(define ((function1 arg0) arg1) (;procedure here...))
这就是我想要的。我想这毕竟不是一个函数来返回一个程序......:/感谢所有的帮助! :)
答案 3 :(得分:0)
这些答案中的许多都正确地显示了从函数返回函数的不同方法。更一般地说,你正在做的事情叫做Currying。更具体地说,“currying”指的是将一个带有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看起来只是一个没有意义的奇怪的东西。