例如,讓說我有一個功能隨着斯卡拉要麼,你怎麼停在第一個錯誤,但得到的已經計算的值
def foo(): Either[String, Int] = ???
我想調用這個函數的3倍。如果所有的值都是Right
,我想要這個總和。如果我有一個Left
,我想得到錯誤和所有以前的Right
值的總和(〜此時停止計算)。
我發現的唯一辦法做到這一點是:
List(foo, foo, foo).foldLeft((None, 0)) {
case ((Some(err), sum), _) => (Some(err), sum)
case ((None, sum), fn) => fn() match {
case Left(err) => (Some(err), sum)
case Right(x) => (None, sum + x)
}
}
有一些通用的函數式編程功能(與貓或scalaz例如)這樣做呢?
你的尾遞歸不滿足'惰性計算的要求foo':「〜此時停止計算」。 – Aivean
確實!重寫爲接受函數列表而不是值列表。 – Rumoku