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