Racket(Scheme)列出作为lambda的参数

时间:2017-12-08 18:45:46

标签: lambda scheme racket

    (define (operation op-list n)
    (list (lambda  (x)  (+ (car x) (cdr x))))

   >(define plus (operation (list 1 2 3 4) 1))
   >(plus (list 1 2))

如何将列表的正确语法作为lambda的参数? Racket-Error:“应用程序:不是程序”

2 个答案:

答案 0 :(得分:0)

那么,让我们来看看你在这里做了些什么。 您可以使用2个参数定义一个名为operation的过程,该过程返回包含lambda的列表。

然后,您将加号定义为(operation (list 1 2 3 4) 1),其评估为包含lambda的列表,如前所述。 然后,您尝试使用另一个列表作为参数调用此列表。 因此'不是程序'。

您要做的是folding。 虽然你似乎并不完全理解列表是如何工作的,所以我建议你先阅读。

答案 1 :(得分:0)

您的问题有点不清楚,但我假设您正在寻找如何将列表放入lambda表达式。 (define (operation x y) (append x y)) (operation (list 1 2)(list 3 4)只是((lambda (x y) (append x y))(list 1 2)(list 3 4))的语法糖。这个例子是为了解释这些功能是如何工作的。但是,如果从过程中删除函数调用,则它不会将值计算为值,而是过程。

    (define (operation op-list n) (list (lambda  (x)  (+ (car x) (cdr x))))

如果我按照我提到的规则将其分解,我们可以看到该操作接受了2个未使用的变量,并将程序放入列表中。

    (define plus (operation (list 1 2 3 4) 1))
    (plus (list 1 2))

如果我们看看plus,它不是一个函数,因为它没有任何函数调用。因此,当您致电(plus (list 1 2)时出现错误,其中plus是应用程序而不是proccedure。