2017-01-02 18 views
0

我是新來的Scala,我正在閱讀Scala書中的函數式編程,在他們的一個練習中,我得到了兩個編譯錯誤,我不明白爲什麼我得到那些。 我得到下面的代碼下面的兩個錯誤:錯誤:構造函數不能實例化到預期的類型

error: value toList is not a member of Chapter5.Stream[Int] 
    val list : List[Int] = st.toList 
          ^
Stream.scala:22: error: constructor cannot be instantiated to expected type; 
found : Chapter5.Cons[A] 
required: Chapter5.Stream.type 
    case Cons(h,t) => h() :: t().toList 
     ^
two errors found 

這是特質和同伴對象:

package Chapter5 

sealed trait Stream[+A] 

case object Empty extends Stream[Nothing] 
case class Cons[+A](h :() => A, t :() => Stream[A]) extends Stream[A] 

object Stream{ 
    def cons[A](hd : => A, tl: => Stream[A]): Stream[A] = { 
    lazy val head = hd 
    lazy val tail = tl 
    Cons(() => head,() => tail) 
    } 

    def empty[A]: Stream[A] = Empty 

    def apply[A](as: A*): Stream[A] = { 
    if (as.isEmpty) empty else cons(as.head, apply(as.tail: _*)) 
    } 

    def toList[A]: List[A] = this match{ 
    case Cons(h,t) => h() :: t().toList 
    case _ => List() 
    } 

} 

當我嘗試調用toList以下方式,我也得到一個錯誤:

package Chapter5 

object Main { 
    def main(args : Array[String]) = { 
    val arr = Array(1,3,4,6) 
    val st : Stream[Int] = Stream.apply(arr : _*) 
    val list : List[Int] = st.toList 
    } 
} 

我不都不懂這些錯誤,對於第一種情況:很顯然,我定義對象的toList方法。對於第二個Cons擴展了Stream特徵,所以我不明白爲什麼我不能使用這樣的模式匹配。

+1

你定義的同伴對象和匹配'裏面的方法toList',它是伴侶的'Stream.type'。這可能不是你想要的。 –

回答

2

您正在定義這些方法在object Stream,而不是trait Stream類型的伴侶對象是(差不多)與類型本身完全無關。將伴侶對象與其類型相關的唯一內容是:

  1. 它們碰巧具有相同的名稱。 (從技術上講,名稱在不同的命名空間中(類型與術語),所以這只是表面上的。)
  2. 他們可以看到對方的private部分。 (這可以通過聲明東西private[this]進行嚴格。)

因此,this第21行,並不意味着「的Stream上,我們正在操作」,它的意思是「這個單獨的對象,稱爲Stream,這幾乎是與性狀無關,也稱爲Stream。「同樣,在第22行,Stream沒有toList方法;它的確是Stream.type(伴侶的類型)。

要麼修改toList採取流參數:

object Stream 
    def toList[E](stream: Stream[E]): List[E] = stream match { 
    //   !^^^^^^^^^^^^^^^^^!   ^!!!!^ 
    } 
} 

或移動toList(可能cons)爲trait Stream

sealed trait Stream[+E] { 
    def cons(hd: => E) = ??? 
    def toList: List[E] = ??? 
} 
+0

很好的答案,非常感謝。 – eager2learn

相關問題