如何以OR方式组合两个布尔函数?

时间:2013-09-18 20:19:58

标签: function scala

你可以帮我解决这个问题:

我有两个功能:

f1: Int => Boolean
f2: Int => Boolean

现在我想将这些函数与逻辑OR组合/合并,如:

f3: Int => f1 || f2

所以只有当函数f1和f2之一返回true时,函数f3才会返回true

如何编写这样的功能?

非常感谢

5 个答案:

答案 0 :(得分:9)

def f3(n:Int) = f1(n) || f2(n)

答案 1 :(得分:6)

所以这是一个很好的基础设施,但我发现在过去实际添加布尔操作作为谓词的有效本机操作是有用的。这是我保留在实用功能包里的东西之一,最终导入到我写的每个项目中。

object PredicateUtils {

  implicit class RichPredicate[A](f: Function1[A, Boolean]) extends Function1[A, Boolean] {
    def apply(v: A) = f(v)

    def &&(g: Function1[A, Boolean]): Function1[A, Boolean] = {
      (x: A) => f(x) && g(x)
    }

    def ||(g: Function1[A, Boolean]): Function1[A, Boolean] = {
      (x: A) => f(x) || g(x)
    }

    def unary_! : Function1[A, Boolean] = {
      (x: A) => !f(x)
    }
  }
}

一旦你完成了,那么你所要做的就是

import PredicateUtils

val f3 = f1 || f2

val f4 = !f1 && f2

答案 2 :(得分:3)

那将是:

def union(f: Int => Boolean, g: Int => Boolean): Int => Boolean= { x => f(x) || g(x)}

这里的问题是来自哪里' x',不是吗?嗯......这就好像你问f或g来自哪里一样。你甚至不考虑这些,那些是参数,这就足够了。同样的答案适用。忘记函数的其余部分。 x => f(x) || g(x)有意义吗?只要f和g返回布尔值就可以了,不是吗?你有。

我会说,如果你从内到外阅读整个功能,它有明显的意义。

干杯!

答案 3 :(得分:2)

def fun_or[T](f1: T => Boolean, f2: T => Boolean)(x: T) = f1(x) || f2(x)

然后:

val f3 = fun_or(f1, f2)

答案 4 :(得分:0)