你能帮我解决这个问题吗:
我有 2 个功能:
f1: Int => Boolean
f2: Int => Boolean
现在我想将这些函数与逻辑 OR 组合/合并,例如:
f3: Int => f1 || f2
所以只有当函数 f1 和 f2 之一返回 true 时,函数 f3 才会返回 true
如何编写这样的函数?
多谢
def f3(n:Int) = f1(n) || f2(n)
所以这是一个很好的基础设施,但我发现在过去实际添加布尔操作作为谓词上的有效本机操作很有用。这是我保存在实用功能包中的东西之一,并最终导入到我编写的几乎每个项目中。
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
那将是:
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 返回布尔值就可以了,不是吗?所以你来了。
我想说,如果你从里到外阅读整个函数,它的意义就很明显了。
干杯!
def fun_or[T](f1: T => Boolean, f2: T => Boolean)(x: T) = f1(x) || f2(x)
然后:
val f3 = fun_or(f1, f2)
构成谓词的示例:http: //danielwestheide.com/blog/2013/01/23/the-neophytes-guide-to-scala-part-10-staying-dry-with-higher-order-functions.html