これは私の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))