我尝试实现StreamInt(不使用泛型类型)并从REPL
收到错误消息<console>:29: error: constructor cannot be instantiated to expected type;
found : Cons
required: StreamInt.type
case Cons(hd,tl)=> if (n==0) hd else tl().nth(n-1)
代码粘贴在下面。任何人都可以告诉我如何正确使用它?
trait StreamInt
case object Empty extends StreamInt
case class Cons (hd: Int, tl: ()=>StreamInt) extends StreamInt
object StreamInt{
def cons(hd:Int, tl: => StreamInt):StreamInt = {
val head=hd
lazy val tail=tl
Cons(head, ()=>tail)
}
def empty:StreamInt = Empty
def apply(as: Int*):StreamInt={
if (as.isEmpty) empty
else cons(as.head, apply(as.tail: _*))
}
def nth(n:Int):Int= this match {
case Cons(hd,tl)=> if (n==0) hd else tl().nth(n-1)
case _ => throw new Exception("out of bound!")
}
}
答案 0 :(得分:1)
这场比赛{
该行表示您匹配包含对象,在您的情况下为object StreamInt
。那个(伴侣)对象永远不会是Cons
单元格。您可能希望在类或 trait nth
上使用方法StreamInt
:
sealed trait StreamInt {
def nth(n:Int):Int= this match {
case Cons(hd,tl)=> if (n==0) hd else tl().nth(n-1)
case Empty => throw new Exception("out of bound!")
}
}
case object Empty extends StreamInt
case class Cons (hd: Int, tl: ()=>StreamInt) extends StreamInt
object StreamInt{
def cons(hd:Int, tl: => StreamInt):StreamInt = {
val head=hd
lazy val tail=tl
Cons(head, ()=>tail)
}
def empty:StreamInt = Empty
def apply(as: Int*):StreamInt={
if (as.isEmpty) empty
else cons(as.head, apply(as.tail: _*))
}
}
现在this
指的是trait StreamInt
,可能确实是Con
或Empty
。
我还添加了sealed
修饰符,确保编译器在使用模式匹配时错过特定情况时可以发出警告。