在Scala中定义流时,“构造函数无法实例化为期望类型”

时间:2018-02-21 09:32:19

标签: scala

我尝试实现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!")

    }

  }

1 个答案:

答案 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,可能确实是ConEmpty

我还添加了sealed修饰符,确保编译器在使用模式匹配时错过特定情况时可以发出警告。