我想定义一个函数,它可以根据对切割“某事”的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的不同子类的函数?
答案 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)}
}