簡體   English   中英

通過嵌套的Option / Try monads進行Scala過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM