Scala通用列表实现

Scala通用列表实现,scala,Scala,在遵循coursera Scala课程my Odersky的同时,我实现了以下示例: trait List[T] { def isEmpty : Boolean def head : T def tail : List[T] override def toString() = if(this.isEmpty) "" else "{" + head + tail + "}" } class Cons[T](val head: T, val tail: List

在遵循coursera Scala课程my Odersky的同时,我实现了以下示例:

trait List[T] {
    def isEmpty : Boolean
    def head : T
    def tail : List[T]

    override def toString() = if(this.isEmpty) "" else  "{" + head + tail + "}"
}

class Cons[T](val head: T, val tail: List[T]) extends List[T] {
    def isEmpty : Boolean = false
}

class Nil[T] extends List[T] {
    def isEmpty : Boolean = true
    def head : Nothing  = throw new NoSuchElementException("Nil.head")
    def tail : Nothing = throw new NoSuchElementException("Nil.tail")
}
然后我尝试创建diff示例,除了我想要创建一个类似示例的列表(4,5,List(2,3))时,大多数示例都有效

val list1=new Cons(4,new Cons(5,new Nil))//工作正常
val list=new Cons(1,new Cons(2,new Cons(3,new Nil))//
val mList=new Cons(列表1,new Cons(列表,new Nil))//工作正常
val nList=new Cons(4,new Cons(list,new Nil))//不起作用
//:11:错误:类型不匹配;
//找到:Cons[Cons[Int]]
//必需:列表[任何]

//注意:Cons[Int]您的问题在于类型

在前两个示例中,您有一个Int列表(具体地说,a
Cons[Int]

但是,在第三个示例中,您有一个Int列表(即a
Cons[Cons[Int]]
)。这种情况是因为列表中的每个元素本身就是一个列表(
list1
list
,如上所述)

最后一个示例失败,因为传递给第一个
Cons
的参数是
4
(一个int)和
newcons(list,new Nil)
,后者是
Cons[Cons[int]
。没有类型
T
,这里的第一个参数是
T
,后者是构造函数要求的
列表[T]

如果您想要一个int列表,则无需在另一个
Cons
构造函数中“包装”
list
(该构造函数生成单个元素列表,其中该元素本身就是列表)。您可以简单地使用:

val nList = new Cons(4, list)

你的问题在于类型

在前两个示例中,您有一个Int列表(具体地说,a
Cons[Int]

但是,在第三个示例中,您有一个Int列表(即a
Cons[Cons[Int]]
)。这种情况是因为列表中的每个元素本身就是一个列表(
list1
list
,如上所述)

最后一个示例失败,因为传递给第一个
Cons
的参数是
4
(一个int)和
newcons(list,new Nil)
,后者是
Cons[Cons[int]
。没有类型
T
,这里的第一个参数是
T
,后者是构造函数要求的
列表[T]

如果您想要一个int列表,则无需在另一个
Cons
构造函数中“包装”
list
(该构造函数生成单个元素列表,其中该元素本身就是列表)。您可以简单地使用:

val nList = new Cons(4, list)

在nList的构造函数中,
newcons(list,new Nil)
创建一个列表[list[Int]](即Int的列表)。然后将其与新的Cons(4,…
)组合,这只适用于List[Int],而不适用于List[List[Int]],因此类型不匹配

这应该奏效:

val nList = new Cons(new Cons(4, Nil), new Cons(list, new Nil)) // List[List[Int]]

一个侧重点:考虑制作CONS和NIL CASE类,然后用免费的Apple方法得到一个同伴对象,允许您从代码中删除所有的<代码>新< /C> > S:

val nList = Cons(Cons(4, Nil), Cons(list, Nil))

在nList的构造函数中,
new Cons(list,new Nil)
创建一个列表[list[Int]](即Int列表)。然后将其与
new Cons(4,…
)组合,该组合只适用于list[Int],而不适用于list[list[Int]],因此类型不匹配

这应该奏效:

val nList = new Cons(new Cons(4, Nil), new Cons(list, new Nil)) // List[List[Int]]

一个侧重点:考虑制作CONS和NIL CASE类,然后用免费的Apple方法得到一个同伴对象,允许您从代码中删除所有的<代码>新< /C> > S:

val nList = Cons(Cons(4, Nil), Cons(list, Nil))

是的,你给出的选项是有效的,但是它创建了{{4},{2,3},正如我想要的{4,{2,3}。如果你说的是正确的,那么这些如何解释val list1=new Cons(4,new Cons(5,new Nil))val list=new Cons(1,new Cons(2,new Cons(3,new Nil)),得到像{4,{2,3},这是一个包含Int和list的列表,因此类型为
list[Any]
,在调用内部Cons时,需要特别声明所需的类型:
new Cons[Any](list,new Nil)
val list1=new Cons(4,new Cons(5,new Nil))
生成一个list[Int](在您给出的符号中,这是“{4,5}”),和
val list=new Cons(1,new Cons(2,new Cons(3,new Nil)))
也会产生一个list[Int](“{1,2,3}”)是的,你给的选项是有效的,但它会创建{{4},{2,3},在我想要的地方{4,{2,3}。如果你说的是正确的,那么这些val list=new Cons(4,new Cons(5,new Nil))val list=new Cons(1,new Cons)是如何解释的呢(2,new Cons(3,new Nil)))要得到类似于{4,{2,3}}的东西,这是一个包含Int和list的列表,因此是
list[Any]
类型,在调用内部Cons时需要特别声明您想要的类型:
new Cons[Any](list,new Nil)
val list1=new Cons(4,new Cons(5,new Nil))
生成一个列表[Int](在您给出的符号中,这是“{4,5}”),并且
val List=new Cons(1,new Cons(2,new Cons(3,new Nil))
还生成一个列表[Int](“{1,2,3}”)