Scala泛型:类型不匹配

时间:2013-12-29 11:55:23

标签: scala collections

为了学习,我想了解“::”课是如何工作的 所以我决定创建自己的但不是称它为“::”我想把它称为“:++:”

List.scala源代码,University of Helsinki和Scala编程第2版(第22章)我应该写:

abstract class List[+A] {
    def isEmpty: Boolean
    def head: A
    def tail: List[A]
}

final case class :++:[A](head: A, tail: List[A]) extends List[A] {
  override def isEmpty: Boolean = false
}


我可以创建“::”对象

  

new ::(1,List(2))

但我不能创建我的“:++:”对象:

new :++:(1, List(2))
<console>:12: error: type mismatch;
found   : List[Int]
required: List[?]
            new :++:(1, List(2))

我的错误在哪里?

2 个答案:

答案 0 :(得分:4)

注释:++:类型参数会给您一个提示:

scala> new :++:[Int](1, List(2))
<console>:11: error: type mismatch;
 found   : scala.collection.immutable.scala.collection.immutable.List[Int]
 required: List(in object $iw)[Int]
              new :++:[Int](1, List(2))
                                   ^

:++:构造函数需要您的一个自定义List[A]个实例,但是您为它提供了一个正常的Scala List(1)

但您目前无法创建列表实例(除了null尾部)。如果你添加等价的Nil,那么你们都很好:

case object Empty extends List[Nothing] { 
  def head = ???
  def isEmpty = true
  def tail = ???
}

然后您可以创建:++:

scala> val a = new :++:[Int](1, Empty)
a: :++:[Int] = :++:(1,Empty)

scala> val b = new :++:(2, a)
b: :++:[Int] = :++:(2,:++:(1,Empty))

答案 1 :(得分:2)

除了gourlaysama's answer解释了为什么你的定义被内置的List遮蔽了,我还想提一些提示。

  1. 根据上述答案,您还应为“空”列表添加EmptyCNil案例对象。
  2. 如果再次检查来源,您会在内置List中找到'cons'方法,类似于下面的方法:

  3. sealed abstract class ConsList[+A] {
        (...)
        def :++:[B >: A](x : B) : ConsList[B] = new :++:(x, this)
    }
    

    它允许您使用中缀表示法创建列表:

    val b = 2 :++: 4 :++: 7 :++: CNil
    

    最后,您可以创建一个配套对象,以便更轻松地创建列表:

    object ConsList {
      def apply[A](xs : A*) = {
        xs.foldRight(CNil : ConsList[A])((el, l) => el :++: l)
      }
    }
    

    这意味着您现在可以创建val c = ConsList(2, 4, 7),其等同于上面的b,也相当于:++:(2, :++:(4, :++:(7, CNil)))