Scala:从函数返回多个数据类型

Scala:从函数返回多个数据类型,scala,Scala,这是一个理论问题,但我可能想做些什么。是否可以从Scala函数返回多种数据类型,但限制允许的类型?我知道我可以通过指定返回一种类型,也可以通过不指定返回类型基本上允许任何数据类型,但我想返回3种特定数据类型中的1种,以保持一点类型安全性。是否有一种方法可以在返回类型中写入“or”,如: def myFunc(input:String): [Int || String] = { ...} 主要内容是尝试编写通用数据加载脚本。我的一些用户使用Spark,一些烫伤,谁知道下一步会是什么。我希望我的用

这是一个理论问题,但我可能想做些什么。是否可以从Scala函数返回多种数据类型,但限制允许的类型?我知道我可以通过指定返回一种类型,也可以通过不指定返回类型基本上允许任何数据类型,但我想返回3种特定数据类型中的1种,以保持一点类型安全性。是否有一种方法可以在返回类型中写入“or”,如:

def myFunc(input:String): [Int || String] = { ...}
主要内容是尝试编写通用数据加载脚本。我的一些用户使用Spark,一些烫伤,谁知道下一步会是什么。我希望我的用户能够使用一个通用加载脚本,该脚本可能返回RichPipe、RDD或其他数据格式,具体取决于他们使用的框架,但我不希望将类型安全性完全排除在外。

您可以使用Scala库提供的类型

def myFunc(input:String): Either[Int, String] = {
    if (...) 
        Left(42) // return an Int
    else
        Right("Hello, world") // return a String
}

通过嵌套,您可以使用两种以上的类型,例如
或[A,或[B,C]]

如注释中所述,您最好使用这两种类型中的任何一种来完成此任务,但如果确实需要,您可以使用隐式

  object IntOrString {
    implicit def fromInt(i: Int): IntOrString = new IntOrString(None, Some(i))
    implicit def fromString(s: String): IntOrString = new IntOrString(Some(s), None)
  }
  case class IntOrString(str: Option[String], int: Option[Int])
  implicit def IntOrStringToInt(v: IntOrString): Int = v.int.get
  implicit def IntOrStringToStr(v: IntOrString): String = v.str.get

  def myFunc(input:String): IntOrString = {
    if(input.isEmpty) {
      1
    }  else {
      "test"
    }
  }

  val i: Int = myFunc("")
  val s: String = myFunc("123")
  //exception
  val ex: Int = myFunc("123")

我会让用户输入的内容不那么含蓄,而更加明确。以下是三个例子:

def loadInt(input: String): Int = { ... }

def loadString(input: String): String = { ... }
这很好也很简单。或者,我们可以使用隐式上下文返回相应的curried函数:

def loader[T]()(implicit context: String): String => T = {
  context match {
    case "RDD" => loadInt _ // or loadString _
  }
}
然后用户将:

implicit val context: String = "RDD" // simple example
val loader: String => Int = loader()
loader(input)
或者,可以将其转换为显式参数:

val loader: String => Int = loader("RDD")

参见Miles Sabin在2011年开发了一种使用纯Scala实现联合类型的方法,该方法在第页中公开。几年来,奥德斯基一直在研究一种新的类型系统,称为依赖对象类型演算,该系统包含联合类型,他的工作在《如果我为多个类型嵌套它们,如何引用嵌套结构》中进行了描述?通过相应地嵌套左/右,如Right(Left(42))?