2017-03-13 7 views
1

Scalaでは、私はArray[Option[(String,String,Try[String])]]を持っており、すべての失敗エラーコードを探したいと思います。内部モナドではなくOption[String]であれば、私はそうのように、理解のためにきれいな少しでSome(x)内容をネストされたOption/Tryモナドによるスカラフィルタ

アクセスすることができます。

for { 
    Some(row) <- row 
    (a,b,c) = row 
    x <- c 
} yield x 

しかし、内部モナドは失敗であるならば、私は苦労しています私はFailure(x) <- cをforステートメントに入れることができないので、それをパターン化する方法を見てください。これは私が紛失している本当にシンプルなもののように感じますが、どんな指針も非常に貴重です。

多くの感謝!

EDIT - 配列を指定しました。これは実際には、tuple3sだけでなく、option-tuple3sの配列です。

答えて

3

a.map(_._3).filter(_.isFailure)は?

EDIT:編集やコメントを見た後、私はあなたにも、私はそれについて考えていませんでした

val tries = for { 
    x <- a 
    z <- x 
} yield z._3 

tries.filter(_.isFailure) 
+0

ありがとう。それはまさに私が理解と一致のプロトコルを考え直すことによって逃した単純な答えです。オプションを削除するには、最初にflatMapを追加する必要がありました(編集を参照)。 – buggaby

+0

ああああああああハングアップ...あなたの編集を見ていない... 'a.flatMap(x => x.map(_._ 3))。filter(_。isFailure)'のような何かをしなければならなかった? – mfirry

+0

正確に。私はちょうどオプションの部分を削除する必要がありました。私はモナドでこれを行うより良い方法があるかもしれないと思うが、それは働いており、私はそれを少し洗っていくために全体のソリューションを再加工したくない。 – buggaby

2

これはArray[Throwable]を返します。

for { 
    (_,_,Failure(e)) <- rows 
} yield e 

おそらく、甘くないバージョンです。

rows.collect{case (_,_,Failure(e)) => e} 
3

異なるタイプの「モナド」を組み合わせるには、モナドトランスと呼ばれるものが必要です。単純に言えば、スカラは、同じモナドの中の異なる種類のモナドをミックスして理解させることはできません。これは、理解のためにマップ/フラットマップ/フィルタの組み合わせに対する構文的砂糖の意味があるからです。

Option、あなたはOptionTryを変換し、望ましい結果を得ることができ、常に最初のものをされたと仮定すると:あなたは本当に大丈夫ですそれTryの内側に何を気にしない場合は

for { 
    Some((a, b, c)) <- row 
    x    <- c.toOption 
} yield x 

を、しかし、あなたがそうしたら、Some(x)を実行するときにその情報を失うことに注意してください。パターンマッチが失敗した場合、Noneが得られます。

私はあなたに役立つことを願っています。

+0

行うことができると思います。モナドの組み合わせの制限についての良い点。私は失敗の内容が必要なので、これは私のためには機能しませんが、知ることは非常に役立ちます。ありがとう。 – buggaby

+0

私はその場合にパターンマッチを使用することを提案します、それは最もクリーンな解決策です:) –

関連する問題