从Scala中的通用选项数组返回值

时间:2012-06-09 17:25:01

标签: scala scala-option

我在使用我的函数泛型方面遇到一些困难,需要一些帮助。我有一个数组采用T的选项,其中T是一个分数。 在F#中,有一个“选择”功能可以从一组选项中删除无。在scala中,我试图使用“flatten”,但它不适用于泛型类型。

我的代码是

var arr = Array.fill(capacity)(None :Option[T])

... 后来我试着得到Some的值:

var flat = arr.flatten

错误是:

错误:无法找到参数m的隐含值:scala.reflect.ClassManifest [U] val flat = arr.flatten

我是一个完整的scala noob,也许不应该玩仿制药:) 我如何使这项工作?

谢谢!

1 个答案:

答案 0 :(得分:6)

问题是您正在尝试创建新的通用数组,并且您的方法不知道如何因为数组需要类型信息。然后,您应该添加ClassManifest上下文绑定,以便数组知道如何创建自己:

def flat[T: ClassManifest](bumpy: Array[Option[T]]): Array[T] = bumpy.flatten
val fish = Array(Some("salmon"), None, Some("haddock"))
flat(fish)  // Prints Array(salmon, haddock)

请注意,如果您尝试将数组直接传递给该方法,那么在尝试确定它的类型时会感到困惑;你需要val的赋值让它知道数组本身包含有关其类型的所有信息,然后flat应该从数组中获取它的类型。