我正在为关系(类似于SQL的)操作制作DSL。我有一个带有
或者
.apply:((Symbol,...)) => Obj
方法的Rep[Table]
类型,该方法返回一个定义了.flatMap:T1 => T2
和.map:T1 => T3
函数的对象Obj
。由于Rep[Table]
类型不知道底层表的模式,因此apply
方法就像是一个投影-仅投影在参数元组中指定的字段(很像无类型Scalding API)。现在类型T1
类似于“元组”,其长度由一些shapeless魔法限制为投影元组的长度,但是元组元素的类型由api用户决定,因此代码如下:val a = loadTable(...)
val res = a(('x, 'y)).map { (t: Row2[Int, Int]) =>
(1, t(0))
}
或者
val res = a(('x, 'y)).map { (t: Row2[String, String]) =>
(1, t(0))
}
一切正常。请注意,必须显式指定map
/flatMap
函数的参数类型。然而,当我尝试在for循环中使用它时:
val a = loadTable(...)
val b = loadTable(...)
val c = loadTable(...)
val res = for {
as: Row2[Int, Int] <- a(('ax, 'ay))
bs: Row2[Int, Int] <- b(('bx, 'by))
cs: Row2[Int, Int] <- c(('cx, 'cy))
} yield (as(0), as(1), bs(0), bs(1), cs(0), cs(1))
IT在缺少withFilter
运算符时报错。添加.withFilter:T1 => Boolean
并不起作用-它会抱怨“扩展函数缺少参数类型”,因为T1
由某些类型参数化。只有添加.withFilter: Row[Int,Int] => Boolean
才能使其正常工作,但这显然不是我想要的。
我的问题是:为什么首先要调用withFilter
,以及如何在我的参数化元组类型T1
中使用它?
编辑
最终,我选择了一个.withFilter:NothingLike => BoolLike
,对于简单检查(如_.isInstanceOf[T1]
)是无操作的,对于一般情况则使用更受限制的.filter:T1 => BoolLike
。
withFilter
是在 for 推导式中针对单子类型的,用于包含一个守卫条件(类似于 for 推导式中的if
),但我可能是错的。 - cmbaxtermap
方法中,以便它能够正确地执行。 - gzm0