【发布时间】:2019-10-21 19:29:54
【问题描述】:
出于学习目的,我正在尝试定义一个名为DoubleMap 的包装类,它提供了mapBoth 方法。它本质上需要两个函数f 和g,其中g 的域是f 的共同域。这个函数的组成(g o f)应该映射到DoubleMap
这是我当前的代码:
implicit class DoubleMap
[A, B, C, F[X] <: List[X]] // just List for now
(xs: F[A])(implicit cbf: CanBuildFrom[F[A], C, F[C]]) {
def mapBoth(f: A => B)(g: B => C): F[C] =
xs.map(f andThen g).to[F]
}
但是,当我想使用这样的方法时:
List(true, false, false).mapBoth(!_)(!_)
我收到一条关于(找到的)类型 CanBuildFrom[List[_], Nothing, List[Nothing]] 和(必需的)类型 CanBuildFrom[List[Boolean], C, List[C]] 之间类型不匹配的神秘错误消息
为什么编译器会推断出第一种类型?
【问题讨论】:
-
Scala
2.12还是2.13? - (我假设 CanBuildFrom 为2.12). -
@LuisMiguelMejíaSuárez 是的。我读到这在 2.13 中被重命名,并且这些泛型方法现在不再返回它们被调用的类型的集合。我没记错吗?
-
在
2.13中,集合框架被重新设计并大大简化,例如这种任务现在“更容易”。 -
@LuisMiguelMejíaSuárez 随时为 Scala 2.13 提供答案!
标签: scala generics higher-kinded-types