Gre*_*Ros 20 .net f# functional-programming composition
是否有一种在F#中逻辑组合谓词的标准方法?例如,让我说我有isCar x,isBlue x然后我想要一些给我的东西:
let isBlueCar x = isCar x && isBlue x
Run Code Online (Sandbox Code Playgroud)
但是使用某种组合而不是调用,可能就像:
let isBlueCar x = isCar && isBlue
Run Code Online (Sandbox Code Playgroud)
优选地,某些东西能够接受大量/任意数量的谓词.
Dan*_*iel 23
您可以定义组合子.
let (<&>) f g = (fun x -> f x && g x)
Run Code Online (Sandbox Code Playgroud)
然后做
let isBlueCar = isCar <&> isBlue
Run Code Online (Sandbox Code Playgroud)
您可以执行以下操作:
let predicates = [isCar; isBlue]
let isBlueCar x = predicates |> List.forall (fun predicate -> predicate x)
Run Code Online (Sandbox Code Playgroud)
更普遍:
let combinePredicates predicates =
fun x -> predicates |> List.forall (fun predicate -> predicate x)
let isBlueCar = combinePredicates [isCar;isBlue]
Run Code Online (Sandbox Code Playgroud)
let meetsAll preds = preds |> Seq.fold (fun p q x -> p x && q x) (fun _ -> true)
// or let meetsAll preds x = preds |> Seq.forall (fun p -> p x)
Run Code Online (Sandbox Code Playgroud)
如在
let isEven x = x%2 = 0
let isDiv5 x = x%5 = 0
let isDiv7 x = x%7 = 0
let div257 = meetsAll [isEven; isDiv5; isDiv7]
for i in 1..100 do
if div257 i then
printfn "%d" i
Run Code Online (Sandbox Code Playgroud)
它没有标准的库函数,但是你可以自己定义过多的单行函数,这里的答案就是证明.
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |