这是我的 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))