Scheme嵌套的lambda函数

时间:2013-06-25 20:37:09

标签: lambda nested scheme expression

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

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

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

(define converse
  (lambda (F) 
    (lambda
      (apply (not (F))))))

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

1 个答案:

答案 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)