【发布时间】:2021-01-18 07:11:24
【问题描述】:
我正在尝试熟悉 Scala 中的高级类型,因此我尝试实现这个简单的方法,该方法采用 Option 的可遍历并将其展平,就像通常展平它一样。但是,编译器会引发错误,因为函数返回类型 Traversable[Any] 而不是 T[S]。为什么会这样,我怎样才能让它正常工作?
def flatten[S, T[_] <: Traversable[_]](list: T[Option[S]]): T[S] = {
list.collect({ case Some(s) => s })
}
我想可能是我错误地定义了T 的类型,但我也尝试了T[_]: Traversable 和T[X] <: Traversable[X],但这些都不起作用。
当然,这是可行的:
def flatten[S](list: Traversable[Option[S]]): Traversable[S] = {
list.collect({ case Some(s) => s })
}
但我不想丢失返回类型的输入类型信息(调用flatten(List[Option[T]]) 应该返回List[T]。
【问题讨论】:
-
scala 版本应该是 2.12 吗?
-
编写操作任何类型集合的通用操作有点困难,我更喜欢使用typeclass 方法。
-
@AndreyTyukin 我在 2.11.2。如果它在不同版本中的工作方式不同,我肯定会很感激描述如何的答案。
-
我认为 Andrey Tyukin 的意思是 Traversable 不在 2.13 中
标签: scala function collections higher-kinded-types