2016-01-05 2 views
1

Довольно простая функция для работы отрицания.Это значение не является функцией и не может быть применено

let negation (value:option<bool>) = 
    match value with 
    |Some true -> Some false 
    |Some false -> Some true 
    |None -> failwith "OOPS" 

но когда я называю это:

negation Some true 

жалуется, что

This value is not a function and cannot be applied 
+3

Просто побочное замечание: Если вы на самом деле не нужно бросать исключение, если параметр 'None' вы могли бы использовать эта функция: 'let negation = Option.map not' – Petr

ответ

8

Вам нужны некоторые круглые скобки там:

negation (Some true) 

Или:

negation <| Some true 

Без скобок, как, что F # компилятор поймет, что линия, как

(negation Some) true 

потому, что применение функции лево-связывания, а затем типы не совпадают: Отрицание должны были бы иметь тип: ('a -> option 'a) -> bool -> bool который четко ISN «т (имеет тип bool option -> bool option)

дополнительно: (мнение включено)

функция Отрицание называется not : bool -> bool. Вы пытаетесь использовать, что на BOOL обернут вариант, поэтому, возможно, что должно быть достаточно:

let negation : bool option -> bool option = Option.map not 
+1

Почему нужны парнеры? – tomab

+0

Я просил ответить, чтобы объяснить, зачем они нужны. –

Смежные вопросы