【问题标题】:Combining Predicates in F#在 F# 中组合谓词
【发布时间】:2012-06-06 21:57:39
【问题描述】:

在 F# 中是否有逻辑组合谓词的标准方法? 例如,假设我有isCar xisBlue x,那么我想要一些能给我的东西:

let isBlueCar x = isCar x && isBlue x

但是使用某种组合,而不是调用,可能像:

let isBlueCar x = isCar && isBlue

最好是能够接受大量/任意数量的谓词。

【问题讨论】:

    标签: .net f# functional-programming composition


    【解决方案1】:

    你可以定义一个组合器。

    let (<&>) f g = (fun x -> f x && g x)
    

    然后做

    let isBlueCar = isCar <&> isBlue
    

    【讨论】:

    • ...真的就这么简单,对吧?我爱 F#。
    • @GregRos - 查看 FParsec (quanttec.com/fparsec),这是一个使用组合器方法构建的精美解析库 :-)
    【解决方案2】:
    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)
    

    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
    

    它没有标准的库函数,但是您可以自己定义大量的单行代码,正如这里的答案所证明的那样。

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      let predicates = [isCar; isBlue]
      let isBlueCar x = predicates |> List.forall (fun predicate -> predicate x)
      

      更一般地说:

      let combinePredicates predicates =
          fun x -> predicates |> List.forall (fun predicate -> predicate x)
      
      let isBlueCar = combinePredicates [isCar;isBlue]
      

      【讨论】:

      • 或无点语法:let isBlueCar = (|&gt;) &gt;&gt; flip List.forall predicates
      • @RamonSnir flip 是在哪里定义的?
      • @GoodNightNerdPride 我不认为它是内置的,你需要自己定义它:let flip f a b = f b a
      【解决方案4】:

      这就是你要找的吗?

      > let (&&<) a b x = a x && b x
      
      val ( &&< ) : ('a -> bool) -> ('a -> bool) -> 'a -> bool
      
      > let isBlueCar = isCar &&< isBlue
      
      val isBlueCar : (int -> bool)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多