gpt4 book ai didi

scala - 创建一个函数,返回几个 bool 谓词的逻辑 OR

转载 作者:行者123 更新时间:2023-12-04 07:31:05 26 4
gpt4 key购买 nike

假设我在我的代码中定义了一些 bool 谓词:

def pred1[A](x: A): Boolean = { ... }
def pred2[A](x: A): Boolean = { ... }
def pred3[A](x: A): Boolean = { ... }

现在,我希望能够创建一个函数,例如 pred1pred3 的逻辑或。

所以,像这样:
def pred1Or3[A](x: A) = or(pred1, pred2)

更好的是,能够进行概括以便我可以提供自己的组合功能会很好。所以,如果相反,我想要逻辑与,我会打电话:
def pred1And3[A](x: A) = combine({_ && _}, pred1, pred2)

我可以通过这种方式实现相同的基本效果:
def pred1And3[A](x: A) = Seq(pred1, pred2) map { _(x) } reduce { _ && _ }

但这似乎有点冗长,掩盖了意图。在 Scala 中是否有更简单的方法来做到这一点?

最佳答案

这是一个简单的解决方案,允许同时传递可变数量的项目。我已经给出了 or 案例和更通用的 combine 案例:

def or[A](ps: (A => Boolean)*) = 
(a: A) => ps.exists(_(a))

def combine[A](ps: (A => Boolean)*)(op: (Boolean, Boolean) => Boolean) =
(a: A) => ps.map(_(a)).reduce(op)

下面是一些示例用法:
// "or" two functions
val pred1or3 = or(pred1, pred3)
pred1or3("the")

// "or" three functions
val pred12or3 = or(pred1, pred2, pred3)
pred12or3("the")

// apply a dijoined rule directly
or(pred1, pred2, pred3)("the")

// combine two functions with "and"
val pred12and3 = combine(pred1, pred3)(_ && _)
pred12and3("the")

// apply a conjoined rule directly
combine(pred1, pred2, pred3)(_ && _)("the")

// stack functions as desired (this is "(pred1 || pred3) && (pred1 || pred2)")
combine(or(pred1, pred3), or(pred1, pred2))(_ && _)("a")

关于scala - 创建一个函数,返回几个 bool 谓词的逻辑 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14326254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com