Scala内部DSL约束

Scala内部DSL约束,scala,dsl,Scala,Dsl,让 及 下面的DSL允许指定通过Box收集的Box字段的约束,例如 val m = Boxes(Set(Box(1,2,3), Box(2,3,4), Box(3,4,5))) DSL m x (>,1) res: Boxes = Boxes(Set(Box(2,3,4), Box(3,4,5))) m y (>=,4) res: Boxes = Boxes(Set(Box(3,4,5))) 查询, 对于额外的Ord和/或Box维度,可以使约束更具可扩展性吗? 可以实现以下语法

下面的DSL允许指定通过Box收集的Box字段的约束,例如

val m = Boxes(Set(Box(1,2,3), Box(2,3,4), Box(3,4,5)))
DSL

m x (>,1)
res: Boxes = Boxes(Set(Box(2,3,4), Box(3,4,5)))

m y (>=,4)
res: Boxes = Boxes(Set(Box(3,4,5)))
查询,

对于额外的Ord和/或Box维度,可以使约束更具可扩展性吗? 可以实现以下语法吗

mx>1


我认为mx>1是可以实现的,但在您可能想要支持诸如:m11与mx<4相交的过程
m x (>,1)
res: Boxes = Boxes(Set(Box(2,3,4), Box(3,4,5)))

m y (>=,4)
res: Boxes = Boxes(Set(Box(3,4,5)))
abstract class Ord
case object >= extends Ord
case object > extends Ord

case class Constraints(xs: Boxes) {
  def x(o: Ord, i: Int) = o match {
    case >= => Boxes( xs.s.filter(_.x >= i) )
    case >  => Boxes( xs.s.filter(_.x >  i) )
  }
  def y(o: Ord, j: Int) = o match {
    case >= => Boxes( xs.s.filter(_.y >= j) )
    case >  => Boxes( xs.s.filter(_.y >  j) )
  }
}

implicit def b2c(m: Boxes) = Constraints(m)