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 次 |
最近记录: |