Scala内部DSL约束
让 及 下面的DSL允许指定通过Box收集的Box字段的约束,例如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维度,可以使约束更具可扩展性吗? 可以实现以下语法
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是可以实现的,但在您可能想要支持诸如:m1
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)