我很难理解如何为lambda表达式的家庭作业问题构建解决方案。我必须编写一个函数,它接受一个参数F,它是一个谓词函数,并返回一个与F相反的新函数。
我知道在我的函数中的某个地方,我将返回传入的谓词函数中的值的not来返回converse,但我对其余的问题描述感到困惑。问题表明“你需要一个lambda内的lambda。因为你不知道F将采用多少个参数(实际上可能采用一个变量号),你将不得不使用apply和语法来定义一个lambda表达式这需要任意数量的参数“
我不明白如何设置嵌套的lambda表达式来做我想做的事情,并返回F可能的相反。我一直在尝试一些不同的东西,只是为了看看我能不能到达任何地方,但我不明白嵌套的lambda表达式是如何工作的,足以让我到处都是。
(define converse
(lambda (F)
(lambda
(apply (not (F))))))
我知道这不起作用,但我需要帮助了解如何设置我的嵌套lambda表达式来做我想要的。
答案 0 :(得分:6)
你非常接近答案:
(define converse
(lambda (f)
(lambda args
(not (apply f args)))))
基本上,你错过了最里面的lambda的args
参数,它将保存f
可以接收的可变数量的参数。在调用not
参数后,f
将被应用。例如,使用两个参数来获取此谓词:
(define (test x y)
(> x y))
了解它的正常运作方式:
(test 10 5)
=> #t
(test 5 10)
=> #f
(test 10 10)
=> #f
现在看看converse
应用于test
后的工作原理。请注意,处理两个参数没有问题:
((converse test) 10 5)
=> #f
((converse test) 5 10)
=> #t
((converse test) 10 10)
=> #t
作为旁注:在Racket中,我们刚刚实现的converse
程序已经存在,并且它被称为negate
。我们可以像这样轻松地实现converse
:
(define converse negate)