为了学习,我想了解“::”课是如何工作的 所以我决定创建自己的但不是称它为“::”我想把它称为“:++:”
从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))
我的错误在哪里?
答案 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
遮蔽了,我还想提一些提示。
Empty
或CNil
案例对象。List
中找到'cons'方法,类似于下面的方法: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)))