gpt4 book ai didi

scala - 使用自定义 CanBuildFrom 和 Builder 获取 map 功能以在 Scala 中工作

转载 作者:行者123 更新时间:2023-12-04 04:47:59 25 4
gpt4 key购买 nike

我有一个生成器从一个 Int 中生成一个字符串:

  class MyBuilder extends LazyBuilder[Int, String]
{
def result: String = "value: " + Int.toString
}

这个 CanBuildFrom 实现:
  class IntToStringCanBuildFrom extends CanBuildFrom[Set[Int], Int, String]
{
def apply(from: Set[Int]) = this.apply()
def apply() : MyBuilder = new MyBuilder
}

我想在以下示例中使用它:
val list = List(1, 2, 3)
val result = list.map(2*)(new IntToStringCanBuildFrom)

但是我得到一个编译错误:
- type mismatch; found : Test.IntToStringCanBuildFrom required: 
scala.collection.generic.CanBuildFrom[List[Int],Int,?]

我到底做错了什么?如何使这项工作?显然它不喜欢我的 CanBuildFrom 实现有一个 String 类型参数的事实,但我认为这应该是这样做的方式。

最佳答案

要做到这一点,您需要在代码中更改几项内容:

  • 首先,您CanBuildFrom定义为适用于 Set[Int]作为输入,但你给它一个 List[Int] (这不是 Set !)。所以它应该是,例如,CanBuildFrom[Seq[Int], Int, String] .自 ListSeq ,它会起作用。
  • 然后,您的懒惰构建器需要对收到的元素进行实际操作。它暴露了一个 protected var parts: ListBuffer[TraversableOnce[Int]]包含添加到其中的所有内容。让我们打印它的内容:
    class MyBuilder extends LazyBuilder[Int, String] {
    def result: String = "value: " + parts.flatten.mkString(",")
    }

    那么,您的 CanBuildFrom可以在调用时创建该构建器:
    class IntSeqToStringCanBuildFrom extends CanBuildFrom[Seq[Int], Int, String] {
    def apply(from: Seq[Int]): Builder[Int, String] = apply()
    def apply(): Builder[Int, String] = new MyBuilder
    }
  • 最后,您可以直接使用它:
    scala> val list = List(1, 2, 3)
    list: List[Int] = List(1, 2, 3)

    scala> val result = list.map(2 * _)(new IntSeqToStringCanBuildFrom)
    result: String = value: 2,4,6

    或间接通过隐含的作用域:
    scala> implicit val intSeqCanBuildFrom = new IntSeqToStringCanBuildFrom
    intSeqCanBuildFrom: IntSeqToStringCanBuildFrom = IntSeqToStringCanBuildFrom@52cc537d

    scala> val result: String = list.map(2 * _)
    result: String = value: 2,4,6
  • 关于scala - 使用自定义 CanBuildFrom 和 Builder 获取 map 功能以在 Scala 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898403/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com