将多个功能合并为一个

时间:2014-07-10 22:27:24

标签: f# functional-programming

美好的一天。你能帮我把几个函数(string -> string -> bool)合并到一个大函数(string -> bool)

我有(contactList:seq<string>)和功能

let checkEqual localPhone azurePhone =
    localPhone = azurePhone

我做了Seq.map来获取函数(string -> bool)

let checks = contactList |> Seq.map (fun x -> checkEqual x)

现在我需要将这个seq以某种方式组合成一个大函数(string -> bool),以便在Azure移动服务的Where子句中使用它。

let! result = table.Where(fun y > checkAll y).ToEnumerableAsync() 
              |> Async.AwaitTask

我想表达这样的表达方式: y == x1 || y == x2 || etc

2 个答案:

答案 0 :(得分:2)

对于此特定情况,您可以使用Seq.exists

checkAll y = checks |> Seq.exists (fun f -> f y)

答案 1 :(得分:0)

对于更通用的解决方案,您可以编写如下内容:

checkAll y = checks |> Seq.fold (fun acc check -> acc || check y) false

acc通常这样命名,因为它是累加器 - 存储到目前为止计算内容的值。

exists的优点是,一旦找到真值,它就会停止扫描序列,而fold总是到达序列的末尾。但是fold更为通用:你可以用你的序列写一个总和,一个产品或者任何全局计算。