Учитывая некоторую функцию f
, которая имеет тип:
f: 'a -> bool
вы хотите иметь возможность сгенерировать другую функцию, чтобы обернуть ее, чтобы свести на нет результат. Давайте рассмотрим тип для этой новой функции, назовем ее negated
(я не использую not
, поскольку это имя встроенной функции):
negated: ('a -> bool) -> 'a -> bool
Почему это тип? Почему бы не 'a -> bool
? Хорошо помните, мы хотим, чтобы эта новая функция принимала существующую функцию и возвращала новую функцию того же типа, которая делает что-то другое. Чтобы было понятнее, вы можете думать об этом так: ('a -> bool) -> ('a -> bool)
, что эквивалентно.
Итак, теперь, учитывая эти ограничения, как мы можем написать функцию negated
?
let negated f = ??
Ну, во-первых, мы должны учитывать, что эта функция должна возвращать функцию:
let negated f = (fun x -> ??)
Что дальше? Что ж, мы знаем, что новая функция, которую мы создаем, должна вызывать нашу упакованную функцию с аргументом и отрицать ее. Давайте сделаем это, вызовем функцию с аргументом: f x
и отвергнем ее: not (f x)
. Это дает нам окончательное определение функции:
let negated f = (fun x -> not (f x))
Давайте посмотрим на это в действии:
# let f x = x < 5;;
val f : int -> bool = <fun>
# f 2;;
- : bool = true
# f 8;;
- : bool = false
# let negated f = (fun x -> not (f x));;
val negated : ('a -> bool) -> 'a -> bool = <fun>
# let g = negated(f);;
val g : int -> bool = <fun>
# g 2;;
- : bool = false
# g 8;;
- : bool = true