You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何编写泛型Iterator的mapInner扩展且不丢失类型信息

解决嵌套集合扩展方法的类型保留问题

首先纠正你代码里的几个语法错误:exstension拼写应为extension,参数和方法定义的括号都未闭合。原实现的核心问题是直接绑定到Iterator[Iterator[A]]类型,任何嵌套集合(比如List[List[Int]])调用时都会被隐式转换为Iterator,自然丢失了原集合类型。

要实现保留原类型的mapInner,需要利用Scala的BuildFrom类型类,它能根据输入集合的类型,构建出同类型的输出集合。以下是Scala 3的正确实现:

import scala.collection.BuildFrom

extension [F[_], G[_], A](outer: F[G[A]])
  def mapInner[B](f: A => B)(using
    bfOuter: BuildFrom[F[G[A]], G[B], F[G[B]]],
    bfInner: BuildFrom[G[A], B, G[B]]
  ): F[G[B]] =
    outer.map { inner =>
      inner.map(f)
    }

关键说明

  • 泛型参数F[_]和G[_]分别代表外层和内层的集合类型(比如List和List,或者Vector和Array)
  • using子句引入的BuildFrom实例,负责根据原集合类型生成对应类型的新集合,避免类型丢失
  • 外层调用map处理每个内层集合,内层调用map转换元素,最终返回和输入同结构的嵌套集合

示例用法

val nums = List(List(1, 2, 3), List(4, 5, 6))
val doubled = nums.mapInner(_ * 2)
// doubled 类型为 List[List[Int]],值为 List(List(2,4,6), List(8,10,12))

val vecs = Vector(Vector("a", "b"), Vector("c", "d"))
val upper = vecs.mapInner(_.toUpperCase)
// upper 类型为 Vector[Vector[String]],值为 Vector(Vector("A","B"), Vector("C","D"))

如果是Scala 2环境,可替换为CanBuildFrom类型类,核心逻辑一致,只是语法略有差异。

内容的提问来源于stack exchange,提问作者solomon alon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:06:27