如何在scala中声明泛型类型函数?

时间:2014-01-09 22:42:14

标签: python scala

我想定义一个函数,它可以根据对切割“某事”的Seq。 例如在python中,我可以像这样写:

def divide(lst, pairs):
    "each pair in pairs is a (base,upper) tuple"
    return [lst[b:u] for b, u in pairs]

>>> divide([1,2,3,4,5,6], [(0, 3), (3, 6)])
[[1, 2, 3], [4, 5, 6]]
>>> divide("abcdef", [(0, 3), (3, 6)])
['abc', 'def']

由于python的动态特性,这个函数可以划分任何可以切片的东西。

在scala中,一个天真的版本(只能划分Seq [Int])是:

def divide(lst:Seq[Int], pairs:Seq[(Int, Int)]) = {
    pairs.map{case (b, u) => lst.slice(b,u)}
}

scala> divide(Seq(1,2,3,4,5,6), Seq((0, 3), (3, 6)))
result: Seq[Seq[Int]] = List(List(1, 2, 3), List(4, 5, 6))

如果我想要一个不仅支持Seq [Int]而且还支持Seq [T]的除法函数,例如Seq [Seq [Int]],我该怎么写呢?

我试过

def divide(lst:Seq[T], pairs:Seq[(Int, Int)]):Seq[Seq[T]] = {
    pairs.map{case (b, u) => lst.slice(b,u)}
}

但它没有编译。

---------- ----------更新

另一个问题是如果我将mutable.Seq作为lst传递,最后我将得到一个Seq(不可变)。

例如

scala> divide(Array(1,2,3,4,5,6), Seq((0, 2), (2, 4), (4, 6)))
result: Seq[Seq[Int]] = ArrayBuffer(WrappedArray(1, 2), WrappedArray(3, 4), WrappedArray(5, 6))

我知道问题是lst被声明为Seq所以它返回一个Seq。 如何声明一个可以处理Seq的不同子类的函数?

1 个答案:

答案 0 :(得分:6)

您需要预先定义类型T.

def divide[T](lst:Seq[T], pairs:Seq[(Int, Int)]):Seq[Seq[T]] = {
    pairs.map{case (b, u) => lst.slice(b,u)}
}