функция 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 ...]))