对于理解过滤选项

时间:2013-12-10 12:32:26

标签: scala monads for-comprehension

我有一组项目,我们可以调用它们Effect,我有一个Cause列表,其中包含possibleEffects : Set[Effect]

我需要遍历效果列表,只返回我为每个Cause找到的第一个Effect。可能存在导致多个效果的重叠原因,这就是结果需要在集合中的原因。我需要尽可能快,因为它执行了很多次。我想出了以下内容(不确定它是否是最好的方式,我是scala的新手)。

我正在尝试使用返回find()的{​​{1}}方法。有没有办法过滤掉那些返回Option[Cause]的东西(它实际上不会发生,列表中总会有原因,除非我有一个bug),并从内部的一些monad中提取它为了理解?我似乎无法在其中使用None

matches

2 个答案:

答案 0 :(得分:4)

因为您可以在for-comprehension中迭代Option,所以您可以将“=”更改为“< - ”,这将为您提供与flatten相同的结果

val firstCauses : Set[Cause] = (for {
     effect <- effects
     possibleCause <- allCauses.find(_.possibleEffects.contains(effect))
} yield possibleCause)

答案 1 :(得分:3)

您无需过滤返回None的内容。您可以使用Set[Option[T]]方法将Set[T]变为flatten。这将为您排除None

> val s = Set(Some(1), None, Some(2), None,Some(3) )
s: scala.collection.immutable.Set[Option[Int]] = Set(Some(1), None, Some(2), Some(3))
> s.flatten
res1: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

所以,要明确的是,您可以{for} yield Option,只需flatten结果。