F#是否可能在Operators.Not
和某些标准.NET函数之间具有函数组合,例如String.IsNullOrEmpty
?
换句话说,为什么以下lambda表达式不可接受:
(fun x -> not >> String.IsNullOrEmpty)
答案 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
但通常首选具有功能构成的无点样式。