Mic*_*ael 8 error-handling scala
假设我有一些功能
val f1: Int => Error1 \/ Int = ??? // maybe should use Kleisli instead
val f2: Int => Error2 \/ Int = ???
val f3: Int => Error3 \/ Int = ???
Run Code Online (Sandbox Code Playgroud)
......我需要把它们组成:
val f123 = {a: Int =>
for(b <- f1(a); c <- f2(b); d <- f3(c)) yield d // does not compile
}
Run Code Online (Sandbox Code Playgroud)
f123应该返回,Error1 | Error2 | Error3 \/ Int但我没有|Scala,因此我使用继承:
sealed trait Error123
object Error1 extends Error123
object Error2 extends Error123
object Error3 extends Error123
val f123: Int => Error123 \/ Int = ... // now it compiles
Run Code Online (Sandbox Code Playgroud)
......但是如果我需要撰写f1并且f2怎么办?
我应该创建一个新的特性Error12并制作Error1和Error2扩展吗?如果我有五个函数f1,f2... f4,f5和五个错误类怎么办?
我不喜欢这种继承方法,因为它改变了已有的类型Error1,Error2等等只是为了定义它们的联合.所以我想知道如何在Scala中将这些类型联合起来.
恕我直言,这是最好的方法。你想做什么?定义一个可能返回结果或类型错误的函数Error123,还有什么可说的?
通过定义Error123为密封特征并使用 N 个更好地描述错误的案例类对其进行扩展,您可以确保调用者必须处理所有情况,因为编译器将要求他使用详尽的模式匹配。
如果它是如此冗长和繁琐,也许您需要重新考虑错误案例的 ADT。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |