Scheme嵌套的lambda函数

Yoi*_*ink 1 lambda scheme expression nested

我很难理解如何为lambda表达式的家庭作业问题构建解决方案.我必须编写一个函数,它接受一个参数F,它是一个谓词函数,并返回一个F函数的新函数.

我知道在我的函数中的某个地方我将返回传入的谓词函数中的值而不是返回反向但我对其余的问题描述感到困惑.问题表明"你需要一个lambda内的lambda.因为你不知道F将采用多少个参数(实际上可能采用一个变量号),你将不得不使用apply和语法来定义一个lambda表达式这需要任意数量的参数"

我不明白如何设置嵌套的lambda表达式来做我想做的事情,返回F可能的反转.我一直在尝试一些不同的东西,只是为了看看我是否可以到达任何地方,但我不明白嵌套的lambda表达式如何工作到足以让我到处都是.

(define converse
  (lambda (F) 
    (lambda
      (apply (not (F))))))
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,但我需要帮助了解如何设置我的嵌套lambda表达式来做我想要的.

Ósc*_*pez 6

你非常接近答案:

(define converse
  (lambda (f)
    (lambda args
      (not (apply f args)))))
Run Code Online (Sandbox Code Playgroud)

基本上,你错过了args最里面的lambda 的参数,它将保存f可以接收的可变数量的参数.并且调用参数之后not应用.例如,使用两个参数获取此谓词:f

(define (test x y)
  (> x y))
Run Code Online (Sandbox Code Playgroud)

看看它是如何工作的:

(test 10 5)
=> #t
(test 5 10)
=> #f
(test 10 10)
=> #f
Run Code Online (Sandbox Code Playgroud)

现在看看它在converse应用之后是如何工作的test.请注意,处理两个参数没有问题:

((converse test) 10 5)
=> #f
((converse test) 5 10)
=> #t
((converse test) 10 10)
=> #t
Run Code Online (Sandbox Code Playgroud)

作为旁注:在Racket中,converse我们刚刚实现的过程已经存在,并且它被调用了negate.我们可以converse像这样轻松地实现:

(define converse negate)
Run Code Online (Sandbox Code Playgroud)