[英]How to declare generic type function in scala?
我想定义一个函数,该函数可以基于对削减“某物”的序列。 例如在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,最后我将获得一个Seq(immutable)。
例如
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))
我知道问题是,第一个被声明为Seq,所以它返回一个Seq。 如何声明一个可以处理Seq不同子类的函数?
您需要预先定义类型T。
def divide[T](lst:Seq[T], pairs:Seq[(Int, Int)]):Seq[Seq[T]] = {
pairs.map{case (b, u) => lst.slice(b,u)}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.