0
给定一个包含某些“类型”标签的对象。 根据某些标准设计匹配器的实现的最佳方式是什么?问题的关键在于如何有效地利用类型系统。如何根据Scala中的标签过滤标准
这是我目前的尝试:
object Criteria1 extends App {
// Features
// Feature A
trait A
case object A1 extends A
case object A2 extends A
// Feature B
trait B
case object B1 extends B
case object B2 extends B
// Criteria
trait Criteria
case class ACriteria(a: Set[A]) extends Criteria
case class BCriteria(b: Set[B]) extends Criteria
// Tag
trait Tag
case class ATag(a: A) extends Tag
case class BTag(b: B) extends Tag
def match_?(criterias: Set[Criteria], tags: Set[Tag]) : Boolean = {
!criterias.exists {
case ACriteria(v) => !v.map(value => ATag(value)).exists(tags.contains)
case BCriteria(v) => !v.map(value => BTag(value)).exists(tags.contains)
}
}
println(match_?(Set(ACriteria(Set(A1, A2))), Set(ATag(A1), ATag(A2)))) // true
println(match_?(Set(ACriteria(Set(A1))), Set(ATag(A1), ATag(A2)))) // true
println(match_?(Set(ACriteria(Set(A1, A2))), Set(ATag(A1)))) // true
println(match_?(Set(), Set(ATag(A1)))) // true
println(match_?(Set(ACriteria(Set(A1))), Set())) // false
println(match_?(Set(ACriteria(Set(A1)), BCriteria(Set(B1))), Set(ATag(A1)))) // false
println(match_?(Set(ACriteria(Set(A1)), BCriteria(Set(B1))), Set(BTag(B1)))) // false
}
但它冗长,在比赛中没有方法真干代码。
[更新]当我想起来,似乎Criteria
和Tags
类型不是很有用。这是一个更简单的版本,但是由于Any
也有较低的类型检查。任何方式来解决(也许Coproduct
)?
object Criteria6 extends App {
// Features
// Feature A
trait A
case object A1 extends A
case object A2 extends A
// Feature B
trait B
case object B1 extends B
case object B2 extends B
def match_?(criterias: Set[Set[Any]], tags: Set[Any]) : Boolean = {
!criterias.exists {
v => !v.exists(tags.contains)
}
}
println(match_?(Set(Set(A1, A2)), Set(A1, A2))) // true
println(match_?(Set(Set(A1)), Set(A1, A2))) // true
println(match_?(Set(Set(A1, A2)), Set(A1))) // true
println(match_?(Set(), Set(A1))) // true
println(match_?(Set(Set(A1)), Set())) // false
println(match_?(Set(Set(A1), Set(B1)), Set(A1))) // false
println(match_?(Set(Set(A1), Set(B1)), Set(B1))) // false
}
不知道我理解你正试图在这里完成的。鉴于你有什么,我会用类型参数替换标准和标签实例。假设,'case class Tag [T](t:T)'。 –