在scala中我自己的list实现中发现了错误



我正在使用通用抽象类List[+T]实现我自己的List集合。我想添加一个map函数,它根据给定的函数改变列表:

abstract class List[+T] {
  def map[U>:T](f: T => U): List[U] = this match {
    case null => this
    case x :: xs => f(x) :: xs.map(f)
  }
}

我在x :: xs中得到以下错误:

构造函数不能实例化为期望的类型。find Scala.collection.immutable .::required List[T]

首先你可以阅读scala集合的架构链接

总而言之,如果您想完全集成一个新的集合类进入框架需要注意以下几点:

  • 决定集合应该是可变的还是不可变的
  • 为集合选择正确的基本特征。
  • 继承正确的实现trait来实现大多数收集操作。
  • 如果你想让map和类似的操作返回你的集合类型的实例,在你的类的伴侣对象中提供一个隐式的CanBuildFrom。

地图在traversableelike中的实现:

def map[B, That](f: Elem => B)
    (implicit bf: CanBuildFrom[Repr, B, That]): That = {
  val b = bf(this)
  this.foreach(x => b += f(x))
  b.result
}

使用::,您正在尝试将自己的List与Scala标准库List相匹配。如果希望使用模式匹配,则需要定义自己的提取器。

你可以在Scala新手指南第1部分:提取器中阅读更多关于中缀提取器的信息,段落中缀操作模式

另一个很好的解释可以在The Scala List extractor demystified中找到:

事实证明,有一个名为::的case类(在scala.collection.immutable包中)扩展了List。case类为您提供的众多巧妙功能之一,是一个带有unapply方法的合成伴侣对象,该方法可以解构该类型的实例

最新更新