【发布时间】:2014-11-01 05:53:29
【问题描述】:
这是我之前的question 的后续。假设我有以下功能:
type Result[A] = Either[String, A] // left is an error message
def f1(a: A): Result[B] = ...
def f2(b: B): Result[C] = ...
def f3(c: C): Result[D] = ...
def f(a: A): Result[D] = for {
b <- f1(a).right
c <- f2(b).right
d <- f3(c).right
} yield d;
假设我还想在错误消息中添加更多信息。
def f(a: A): Result[D] = for {
b <- { val r = f1(a); r.left.map(_ + s"failed with $a"); r.right }
c <- { val r = f2(b); r.left.map(_ + s"failed with $a and $b"); r.right }
d <- { val r = f3(c); r.left.map(_ + s"failed with $a, $b, and $c"); r.right }
} yield d;
代码看起来很难看。你会如何建议改进代码?
【问题讨论】:
-
为什么不只是
f1(a).left.map(_ + s"failed with $a").right? -
谢谢。你是对的。
-
是否有任何理由不将参数附加到函数 f1、f2、f3 中的错误消息中?
-
最好使用Scalaz'
\/,它有右偏。 Scala 的Either不适合这个。
标签: scala error-handling either