繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM