我在使用我的函数泛型方面遇到一些困难,需要一些帮助。我有一个数组采用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,也许不应该玩仿制药:) 我如何使这项工作?
谢谢!
答案 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
应该从数组中获取它的类型。