F#中不是函数和函数组合

时间:2015-04-09 20:20:24

标签: function lambda f# functional-programming function-composition

F#是否可能在Operators.Not和某些标准.NET函数之间具有函数组合,例如String.IsNullOrEmpty

换句话说,为什么以下lambda表达式不可接受:

(fun x -> not >> String.IsNullOrEmpty)

2 个答案:

答案 0 :(得分:8)

>>函数组合以另一种方式工作 - 它将左侧函数的结果传递给右侧的函数 - 因此您的代码段正在将bool传递给IsNullOrEmpty ,这是一个类型错误。以下作品:

(fun x -> String.IsNullOrEmpty >> not)

或者你可以使用反向函数组合(但我认为>>通常在F#中是首选的):

(fun x -> not << String.IsNullOrEmpty)

除此之外,此代码段正在创建类型为'a -> string -> bool的函数,因为它忽略了参数x。所以我想你可能真的只想:

(String.IsNullOrEmpty >> not)

答案 1 :(得分:1)

如果要使用参数x,可以使用管道运算符|>而不是函数组合运算符(<<>>)。

fun x -> x |> String.IsNullOrEmpty |> not

但通常首选具有功能构成的无点样式。