Scala通用列表实现
在遵循coursera Scala课程my Odersky的同时,我实现了以下示例: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
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列表(具体地说,aCons[Int]
)
但是,在第三个示例中,您有一个Int列表(即aCons[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列表(具体地说,aCons[Int]
)
但是,在第三个示例中,您有一个Int列表(即aCons[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}”)