我有一个过滤函数,它接受像奇数这样的谓词? 并处理列表。这是代码
onChange
如何传递(而不是(f?))作为函数?
答案 0 :(得分:4)
not
函数具有签名Any -> Boolean
。本质上是:
(define (not x)
(if (eq? x #f) #t #f))
您正在寻找的是一个将输出转换为另一个给定函数的函数。 (或者基本上是签名的功能:(Any -> Boolean) -> (Any -> Boolean)
正如@Sylwester所建议的那样,最简单的方法是使用compose
。您可以将其定义为:
(define (invert f)
(compose not f))
现在,您可以将even?
定义为:
(define even? (invert odd?))
您也可以不使用invert
来定义compose
。我会给你模板,其余的作为练习:
;; Invert the results of a predicate
;; (Any -> Boolean) -> (Any -> Boolean)
(define (invert f)
(lambda (x)
(cond
[(f x) ...]
[else ...])))
(请注意,球拍具有以下功能的缩写:
(define ((invert f) x)
(cond
[(f x) ...]
[else ...]))
答案 1 :(得分:0)
解决方案
编写一个函数,该函数将返回lambda表达式,并在您的谓词函数的任何参数上应用not
。
(define (my-not predicate-func)
(lambda (x) (not (predicate-func x))))
(my-not f?)
返回一个函数,该函数是f?
的反向谓词函数。
(因此不需要compose
...-很好my-not
是手动compose
-通过not
(谓词功能)功能f?
定义主体)。
我称它为my-not
是为了不覆盖Racket中已经存在的not
函数,该函数转换布尔值,因此返回一个布尔值。
({my-not
接受一个函数并返回一个函数-Function -> Function
或lambda -> lambda
:)。)
my-not
也可以称为invert
。
应用
因此,您可以将(my-not f?)
赋予manual-filter
函数而不是f?
:
(manual-filter (my-not f?) lst)
尝试
您还可以测试:
(even? 3) ;; #f
(even? 4) ;; #t
((my-not even?) 3) ;; #t
((my-not even?) 4) ;; #f
;; so `(my-not even?)` behaves exactly like `odd?` - the inverse of `even?`
(odd? 3) ;; #t
(odd? 4) ;; #f