3

私はアイテムのセットを持っています。それらEffectを呼び出しましょう。リストにはCausepossibleEffects : Set[Effect]

効果のリストを繰り返し処理し、Causeそれぞれについて最初に見つけたものだけを返す必要がありますEffect。複数の結果を引き起こす原因が重複している可能性があるため、結果をセットにする必要があります。これは何度も実行されるため、できるだけ高速にする必要があります。私は次のことを思いつきました(それが最善の方法であるかどうかはわかりません。私はscalaが初めてです)。

find()を返すメソッドを使用しようとしていますOption[Cause]。返されるものを除外する方法はありますNoneか (実際には発生しません。バグがない限り、リストには常に原因があります)、理解のために Some モナドから抽出する方法はありますか? 中では使えないようですmatches

  val firstCauses : Set[Cause] = (for {
             effect <- effects
             possibleCause = allCauses.find(_.possibleEffects.contains(effect))
             //todo: filter out possibleCause if it is not Some(Cause), and get it out of the Some monad so that the yield takes it
           } yield possibleCause).toSet
4

2 に答える 2

4

Option は for 内包表記で反復できるため、"=" を "<-" に変更すると、flatten と同じ結果が得られます。

val firstCauses : Set[Cause] = (for {
     effect <- effects
     possibleCause <- allCauses.find(_.possibleEffects.contains(effect))
} yield possibleCause)
于 2013-12-10T14:01:04.993 に答える
3

を返すものをフィルタリングする必要はありませんNone。メソッドを使用して a を aSet[Option[T]]に変換できます。これにより、次のことがなくなります。Set[T]flattenNone

> 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)

したがって、明確にするためにyieldOption理解とflatten結果のみを使用できます。

于 2013-12-10T13:31:59.243 に答える