【发布时间】:2021-03-16 00:34:21
【问题描述】:
这是我的 scala2 代码到 scala3 的直接翻译
trait Narrow[F[_], A, B <: A: ClassTag]:
def apply(fa: F[A]): F[B]
extension [F[_], A] (fa: F[A]):
def narrow[B: ClassTag] (using op: Narrow[F, A, B]): F[B] = op(fa)
我需要在调用站点指定窄操作的类型,但是扩展方法不允许该语法。对于这个限制有什么最好的解决方法?
这样做的目的是能够缩小集合/尝试/任何东西中的类型。窄类型类将对内部的任何内容进行平面映射,比较运行时类型,如果它匹配将 B 包装在 F 中,否则返回一个空 F
trait A
trait B extends A
object A extends A
object B extends B
val bb: List[B] = List(A, A, B, B, A)
.narrow[B]
assert(bb == List(B, B))
【问题讨论】:
-
现在 Scala 3 支持此功能。
-
3.0.0-RC1 - dotty.epfl.ch/blog/2021/02/17/scala3-rc1.html
标签: scala extension-methods dotty scala-3