gpt4 book ai didi

Scala 的 for-comprehension `if` 语句

转载 作者:行者123 更新时间:2023-12-03 10:34:20 24 4
gpt4 key购买 nike

是否可以在 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 ... ),我本来希望它迭代所述查询的结果。

最佳答案

所以,我想您是在问 if 是否可能for-comprehension 中的语句来更改结果类型。答案是“是的,但是……”。

首先,了解 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 集合上, withFilter 不会改变集合的类型。但是,您可以编写自己的类来做到这一点。

关于Scala 的 for-comprehension `if` 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7949785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com