阶函数返回类型之一或

问题描述:

我在scala返回要么nullList[Double]List[List[List[Double]]]按条件已经函数。我使用关键字Any来定义return type,它适用于我,但如果我试图使用List的属性(如返回值的“长度”),它会给我错误,如value length is not a member of Any阶函数返回类型之一或

def extract_val(tuple: Tuple3[String,List[Double],List[List[List[Double]]]]): (Any) ={ 
    /* 
     do something here 
    */ 
} 

我试图找出一些方法,这样我可以定义两种或我的函数定义返回类型:

def extract_val(tuple: Tuple3[String,List[Double],List[List[List[Double]]]]): (either Type A or either Type B) ={ 
    /* 
     if something : 
      return null 
     elif something: 
      return Type A 
     elif something 
      return Type B 
    */ 
} 

我使用的是现在,我已经定义的函数OR operator as (Type A || Type B)但我得到了一些错误not found type ||。任何帮助都会非常有用。

+0

OR运算符为类型被称为'\ /'(类似的逻辑析取符号,∨),并且可以在[Scalaz]中找到(https://scalaz.github.io/scalaz/)图书馆。 –

+6

我可能会建议你返回'Option [或者[A,B]]'。 'Option []'这样你可以使用'None'而不是'null'和'''''''在两个不相关的类型中进行选择。 – jwvh

+0

如果你只需要结果列表的属性,你可以使用返回类型:'List [Any]'。它可以处理所有三种可能的返回值,尽管这不是一个好的设计。 – ntn

如果您知道您的返回类型始终为空(空)或A或B,则使用Option[Either[A,B]]是最快的方法。

这个解决方案的主要限制是,这将是更难展开更多的类型,C,d等

如果扩展是你需要什么,你可以实现自己的OneOf类型。在Scala中你可以做到这一点相对容易。

sealed trait OneOf[A,B,C] 
case class First[A,B,C](a: A) extends OneOf[A,B,C] 
case class Second[A,B,C](b: B) extends OneOf[A,B,C] 
case class Third[A,B,C](c: C) extends OneOf[A,B,C] 

下面是一个简单的(玩具)用例:

def x(i: Int): OneOf[Int,Boolean,Double] = i match { 
    case 1 => First(10) 
    case 2 => Second(true) 
    case _ => Third(0.2) 
} 

scala> x(2) 
res1: OneOf[Int,Boolean,Double] = Second(true) 

scala> x(1) 
res2: OneOf[Int,Boolean,Double] = First(10) 

scala> x(2) 
res3: OneOf[Int,Boolean,Double] = Second(true) 

scala> x(3) 
res4: OneOf[Int,Boolean,Double] = Third(0.2) 

这里是采用一个OneOf和不同的方式处理每一个选项的方法。

def takeOneOf[A,B,C](x: OneOf[A,B,C]) = x match { 
    case First(a) => println(s"A=$a") 
    case Second(b) => println(s"B=$b") 
    case Third(c) => println(s"C=$c") 
} 
+0

没有不是null。 –

+0

我并不是指Scala中的Nothing类型。没有字面意思,你没有任何东西可以返回(或为空)。也许我不应该利用它。 – marios