Scala中的多选项类型

Scala中的多选项类型,scala,Scala,如何存档一种返回类型为T或类型为Error的选项类型 我正在执行一些web请求,响应要么是“ok”并包含对象,要么调用返回一个错误,在这种情况下,我希望提供一个带有错误原因的错误对象 比如: def myRequest() : Result[MyObject] { if (thereWasAnError) Error(reason) else MyObject } scala。或者 类型应完全符合您的要求: def myRequest() : Either[String, MyObjec

如何存档一种返回类型为T或类型为Error的选项类型

我正在执行一些web请求,响应要么是“ok”并包含对象,要么调用返回一个错误,在这种情况下,我希望提供一个带有错误原因的错误对象

比如:

def myRequest() : Result[MyObject] {
  if (thereWasAnError) Error(reason) else MyObject 
}
scala。或者
类型应完全符合您的要求:

def myRequest() : Either[String, MyObject] = 
    if (thereWasAnError) 
        Left("Some error message") 
    else 
        Right(new MyObject)
任一
类似于
选项
,但可以保留两个可能值中的一个:左或右。按照惯例,右边是正常的,而左边是错误的

现在,您可以进行一些奇特的模式匹配:

myRequest() match {
    case Right(myObject) =>
        //...
    case Left(errorMsg) =>
        //...
}
scala.Option.toRight()
同样,您可以使用
选项
并将其转换为
。由于通常
*right*值用于成功,left*值用于失败,因此我建议使用
toRight()
而不是
toLeft()`:


但是,在这个简单的示例中,直接返回
作为
myRequest()
的结果似乎更简单。

哪种方法更好?或者像aioobe建议的那样使用case类?我想在这两种情况下,我都必须在“确定”的情况下打开对象以获得MyObject结果?@user3001:
或者
是专门为您这样的情况设计的(两种类型的结果,其中一种被视为错误或失败对象)。aioobe建议的案例类功能更强大,因为您可以有两个以上的选项(在您的情况下不太可能)。另外,
是内置的。这两种解决方案都可以使用模式匹配轻松地提取值(参见我的第二个代码段和)。是否有任何社区标准,这两个参数中的哪一个应该是错误对象?我所做的是使用toRight来拥有一个速记函数:
def result[T](xmlConverter:(NodeSeq)=>T):或者[T,Error]=Error.toRight(xmlConverter(xml))
,因此如果有错误,返回一个错误对象,或者从XML创建一个结果对象顺便说一下,这种事情最好由Scalaz
验证处理?优势是什么?这将是一个额外的依赖项……查找它——在堆栈溢出上和堆栈溢出之外。除了作为比
更好的抽象之外,很难解释其优点。就这一点而言,Lift还有另一种选择——
Box
——也是
不足的结果。Daniel是对的,验证肯定更好。原因很简单,验证是右偏的,通过对left/error类型使用半群(基本上是reducer函数),可以更容易地在左侧累积错误。请参阅下面的精彩介绍:谢谢:)我正在编写一个scala库来解决这个问题。我首先决定异常是没有选择的,因为来自web服务的
错误是可能发生的结果。不检查异常。如果将库用于web服务,您会更喜欢验证,尽管只有一种类型的错误,对吗?
def myRequest() : Option[MyObject] =
    if (thereWasAnError)
        None
    else
        Some(new MyObject)

val result: Either[String, MyObject] = myRequest() toRight "Some error message"