[英]Scala filter by nested Option/Try monads
在Scala中,我有一個Array[Option[(String,String,Try[String])]]
並希望找到所有失敗錯誤代碼。
如果內部monad是一個Option[String]
,我可以訪問Some(x)
內容,只需要一點點理解,就像這樣:
for {
Some(row) <- row
(a,b,c) = row
x <- c
} yield x
但是如果內部monad是一個失敗,那么我很難看到如何模式匹配它,因為我不能將Failure(x) <- c
放在for語句中。 這感覺就像一件我很遺憾的事情,但任何指導都會非常有價值。
非常感謝!
編輯 - 錯誤指定了數組。 它實際上是一個選項-tuple3s的數組,而不僅僅是tuple3s。
請問a.map(_._3).filter(_.isFailure)
嗎?
編輯:看過編輯和評論后,我想你也可以
val tries = for {
x <- a
z <- x
} yield z._3
tries.filter(_.isFailure)
為了組合不同類型的“monad”,你需要所謂的monad變換器。 簡單地說,Scala不允許你在同一個中混合使用不同的monad類型進行理解 - 這是有道理的,因為對於map / flatMap / filter的組合只需要語法糖。
假設第一個始終是一個Option
那么您可以將Try
轉換為Option
並獲得所需的結果:
for {
Some((a, b, c)) <- row
x <- c.toOption
} yield x
如果你真的不在乎里面的東西那么Try
那很好,但如果你這樣做,那么在做Some(x)
時你會小心丟失那些信息。 如果模式匹配失敗,那么您將獲得None
。
我希望能幫助你。
這將返回一個Array[Throwable]
。
for {
(_,_,Failure(e)) <- rows
} yield e
或者,也許是一個沒有加糖的版本。
rows.collect{case (_,_,Failure(e)) => e}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.