加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 创建一个返回多个布尔谓词的逻辑OR的函数

发布时间:2020-12-16 10:08:27 所属栏目:安全 来源:网络整理
导读:假设我的代码中定义了许多布尔谓词: def pred1[A](x: A): Boolean = { ... }def pred2[A](x: A): Boolean = { ... }def pred3[A](x: A): Boolean = { ... } 现在,我希望能够创建一个函数,例如,pred1和pred3的逻辑OR. 所以,像: def pred1Or3[A](x: A) = or(
假设我的代码中定义了许多布尔谓词:

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

现在,我希望能够创建一个函数,例如,pred1和pred3的逻辑OR.

所以,像:

def pred1Or3[A](x: A) = or(pred1,pred2)

更好的是,能够推广以便我可以提供自己的组合功能会很好.所以,如果相反,我想要有逻辑AND,我会打电话:

def pred1And3[A](x: A) = combine({_ && _},pred1,pred2)

我可以用这种方式达到同样的基本效果:

def pred1And3[A](x: A) = Seq(pred1,pred2) map { _(x) } reduce { _ && _ }

但这看起来有点冗长,并且意味着什么.在Scala中有更简单的方法吗?

解决方法

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

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,pred3)("the")                 

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读