Возможно ли, чтобы в F# была композиция функций между Operators.Not
и какой-либо стандартной функцией .NET, например String.IsNullOrEmpty
?
Другими словами, почему следующее лямбда-выражение неприемлемо:
(fun x -> not >> String.IsNullOrEmpty)
Возможно ли, чтобы в F# была композиция функций между Operators.Not
и какой-либо стандартной функцией .NET, например String.IsNullOrEmpty
?
Другими словами, почему следующее лямбда-выражение неприемлемо:
(fun x -> not >> String.IsNullOrEmpty)
Композиция функции >>
работает наоборот — она передает результат функции слева функции справа — поэтому ваш фрагмент передает bool
в IsNullOrEmpty
, что является ошибкой типа. Следующие работы:
(fun x -> String.IsNullOrEmpty >> not)
Или вы можете использовать обратную композицию функций (но я думаю, что >>
обычно предпочтительнее в F #):
(fun x -> not << String.IsNullOrEmpty)
Кроме того, этот фрагмент создает функцию типа 'a -> string -> bool
, поскольку игнорирует аргумент x
. Итак, я полагаю, вы можете просто захотеть:
(String.IsNullOrEmpty >> not)
Если вы хотите использовать аргумент x
, вы можете использовать оператор канала |>
вместо операторов композиции функций (<<
или >>
).
fun x -> x |> String.IsNullOrEmpty |> not
Но обычно предпочтительнее бесточечный стиль с функциональной композицией.