2015-02-25 2 views
2

У меня есть предикат в F #, напримерСоздание отрицания предиката F #

let myFunc x y = x < y 

Есть ли способ, чтобы создать отрицание версии этой функции?

Так что то, что было бы функционально похож на

let otherFunc x y = x >= y 

Но с помощью оригинального MyFunc?

let otherFunc = !myFunc // not valid 

ответ

9

То, что вы пытаетесь сделать, называется «состав функций». Проверьте функцию состава оператора F #:

у меня нет компилятора доступны для экспериментов, но вы могли бы начать с

let otherFunc = myFunc >> not 

и работать ваш путь через ошибки.

EDIT: Макс Малук указывает на то, что это не будет работать с текущим определением myFunc, потому что она принимает два аргумента (в некотором смысле, это функционально-земля). Таким образом, для того, чтобы сделать эту работу, myFunc необходимо будет изменить в принятии Кортеж:

let myFunc (a, b) = a > b 
let otherFunc = myFunc >> not 
let what = otherFunc (3, 4) 
+0

Он будет работать только тогда, когда вы предоставите первый аргумент. let otherFunc x = myFunc x >> not –

+0

@MaxMalook Это зависит от типа функции и контекста. Если конечный тип может быть выведен, что часто бывает в реальных случаях использования, состав действителен. Я бы предпочел функциональную композицию там, где она работает, для краткости, а так как дополнительные именованные значения привлекают внимание. – Vandroiy

3

Отрицание в F # это делается с помощью функции not. Оператор ! предназначен для разыменования ячеек ref.

let otherFunc x y = not (myFunc x y) 
Смежные вопросы