我如何通过(不是f)作为f?

时间:2018-11-24 23:44:01

标签: scheme racket

我有一个过滤函数,它接受像奇数这样的谓词? 并处理列表。这是代码

onChange

如何传递(而不是(f?))作为函数?

2 个答案:

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