2017-11-16 18 views
0

リスト内のすべての要素を合計しようとしましたが、Option [Int]型であり、Noneの場合はNone、すべての場合はNoneです。 (値)で、私はそれらの合計を求めています:Option [Int] Scalaを使用した合計のリスト

val ls = List(Some(2), Some(5), Some(4), Some(1)) 

ls.fold(None)((rs,x) => for(n <- x; m <- rs) yield {n+m}) 

しかし、私はいつも、何もありません。

答えて

3

もこれを試してみてください:

val ls = List(Some(2), Some(5), Some(4), Some(1)) 
val sum = ls.foldLeft(Option(0))((so, io) => so.flatMap(s => io.map(s + _))) 

リスト内の任意の単一の値がNoneであれば、sumNoneとして報告されています。それ以外の場合は、すべての値が定義されている場合、要素の合計を含むSomeが得られます。リストが空の場合、結果としてSome(0)が返されます。

+0

ねえ、私はそれが大好き、プラス1つ。私はそれを少し試してみると、私もそれを理解することができます参照してください、あなたは私のバージョンを折り畳み権利と言ったのですか? –

+0

@DamianLatteneroはい。 2つの答えは同等です。 –

+0

ええ、私はフラットマップとマップを持つバリアントが好きです、面白いです –

1

私はそれが倍のベースケースだった、私の誤りでした何を実現:ケースベースとして

val ls = List(Some(2), Some(5), Some(4), Some(1)) 

ls.fold(Some(0))((rs,x) => for(n <- x; m <- rs) yield {n+m}) 

の代わりになし、私はなく、オプションの文脈で、0を置きます。

1

すべての値が定義されているかどうかをチェックするためにforallを使用し、定義されている場合はfoldを得るためにfoldを適用します。

scala> val ls = List(Some(2), Some(5), Some(4), Some(1)) 
ls: List[Some[Int]] = List(Some(2), Some(5), Some(4), Some(1)) 

scala> if(ls.forall(_.isDefined)) Some(ls.flatten.foldLeft(0){_ + _ }) else None 
res22: Option[Int] = Some(12) 

scala> val ls = List(Some(2), None,Some(5), Some(4), Some(1),None) 
ls: List[Option[Int]] = List(Some(2), None, Some(5), Some(4), Some(1), None) 

scala> if(ls.forall(_.isDefined)) Some(ls.flatten.foldLeft(0){_ + _ }) else None 
res23: Option[Int] = None 

scala> 
+0

いいえ、Intの結果を望んでいません。Option [Int]の結果が必要です。左の折り返しで答えをチェックしてください。 –

+0

Some Some in sum )他に定義されていない場合なし? –

+0

そのようなものが1つだけの場合はNone、すべてがNone、すべての場合はsone(結果) –

関連する問題