如何在不丢失类型信息的情况下为scala中的泛型迭代器编写一个exstreng-map内部



我试过

exstension[A] (f: Iterator[Iterator[A]){
def mapInner[B](f: A => B): Iterator[Iterator[B]

但这会丢失类型信息,因为如果我给它一个列表[list[Int]],我会得到Iterator[Inter]

尝试函数和朋友:

trait Functor[F[_]]:
extension [A](fa: F[A]) def fmap[B](fmap: A => B): F[B]
object Functor:
given Functor[List] with
extension [A](fa: List[A]) def fmap[B](fmap: A => B): List[B] =
fa.map(fmap)

given [F[_], G[_]](using F: Functor[F], G: Functor[G]): Functor[[x] =>> F[G[x]]] with
extension [A](fa: F[G[A]]) def fmap[B](fmap: A => B): F[G[B]] =
F.fmap(fa)(ga => G.fmap(ga)(fmap))
import Functor.given
val xs = List(1, 2, 3, 4)
val xss = xs.map(x => List(x, x))
val fxss = summon[Functor[[x] =>> List[List[x]]]]
println(fxss.fmap(xss)((a: Int) => a * 2))

这需要很多设置,但很可能你不必自己做,也不必使用scalaz或cats这样的库,因为所有这些都已经定义好了。

最新更新