在scala中,是否可以专门研究if中的条件以便理解?我是这样想的:
val collection: SomeGenericCollection[Int] = ...
trait CollectionFilter
case object Even extends CollectionFilter
case object Odd extends CollectionFilter
val evenColl = for { i <- collection if(Even) } yield i
//evenColl would be a SomeGenericEvenCollection instance
val oddColl = for { i <- collection if(Odd) } yield i
//oddColl would be a SomeGenericOddCollection instance要点是,通过生成i,我得到了一个潜在不同类型的新集合(因此我将其称为“专门化”)-而不仅仅是同一个GenericCollection类型的过滤版本。
我问这个问题的原因是我看到了一些我无法理解的东西(一个例子可以在on line 33 of this ScalaQuery example找到。它所做的是为一个数据库(即SELECT ... FROM ... WHERE ...)创建一个查询,我原本希望它遍历该查询的结果。
发布于 2011-10-31 12:02:51
因此,我认为您是在问是否可以在for-comprehension中使用if语句来更改结果类型。答案是“是的,但是……”。
首先,理解for-comprehensions是如何扩展的。在Stack Overflow上有一些问题在讨论它,还有一些参数可以传递给编译器,这样它就会告诉你发生了什么。
不管怎样,这段代码:
val evenColl = for { i <- collection if(Even) } yield i翻译为:
val evenColl = collection.withFilter(i => Even).map(i => i)因此,如果withFilter方法更改了集合类型,它将执行您想要的操作--在这个简单的例子中。在更复杂的情况下,单凭这一点是行不通的:
for {
x <- xs
y <- ys
if cond
} yield (x, y)被翻译为
xs.flatMap(ys.withFilter(y => cond).map(y => (x, y)))在这种情况下,flatMap将决定返回哪种类型。如果它从返回的结果中得到提示,那么它就可以工作。
现在,在Scala Collections上,withFilter不会改变集合的类型。但是,您也可以编写自己的类来实现这一点。
发布于 2011-10-31 12:02:37
是的,你可以--请参考this tutorial获取一个简单的例子。您引用的scala查询示例也在对集合进行迭代,然后使用该数据构建查询。
https://stackoverflow.com/questions/7949785
复制相似问题