2016-10-27 20 views
0

我收到以下編譯時錯誤在下面的代碼有什麼不對下面的Scala代碼

錯誤:(7,29)未發現:價值缺點

高清:: [B>: A](頭:B)=缺點[B](頭部,這一點)

package basics 

sealed trait List[+A] { 

    import Types._ 

    def ::[B >: A](head: B) = Cons[B](head, this) 

    def foreach(f: A => Unit): Unit = { 
    this match { 
     case x :: t => { 
     f(x) 
     t foreach f 
     } 
     case Nil =>() 
    } 
    } 

} 

object Types { 
    type Cons[A] = ::[A] 
} 
case class ::[+A](head: A, tail: List[A]) extends List[A] 
object Nil extends List[Nothing] 


object Application { 

    def main(args: Array[String]): Unit ={ 
    println("hello") 

    3 :: Nil 
    } 
} 
+1

嘗試'Types.Cons'。你發佈錯誤的代碼btw。在你的例子中它是':: [B](head,this)'。 – talex

+0

@talex將編輯代碼。 Type.Cons也有同樣的問題 –

回答

2

缺點是類型別名不是一個值。它不能發生在價值位置。例如:

我做了一些修改程序,使其工作:

case class ::[+A](head: A, tail: List[A]) extends List[A] 
object Nil extends List[Nothing] 

object Types { 
    type Cons[A] = ::[A] 
    def cons[A](head: A, tail: List[A]) = ::(head,tail) 
} 

sealed trait List[+A] { 
    import Types._ 

    def ::[B >: A](head: B):Cons[B] = cons[B](head, this) 
} 

def ::[B >: A](head: B):Cons[B] = cons[B](head, this):Cons[B]說明一個類型別名的一個正確的使用情況。

與你的程序的另一個問題是在同一個域內的兩個::重載符號的存在,這就是爲什麼它需要的Types.cons創建,否則Scala編譯器認爲我們正在試圖調用List#::

下面是一個例子來自REPL:

scala> 3 :: Nil 
res0: Types.Cons[Int] = ::(3,[email protected]) 

scala> 3 :: 4 :: Nil 
res1: Types.Cons[Int] = ::(3,::(4,[email protected])) 

查看錶達式的類型是Cons[Int]

1

其原因是

object Types { 
    type Cons[A] = ::[A] 
} 

是一種類型的聲明,但Cons in

def ::[B >: A](head: B) = Cons[B](head, this) 

是對構造函數的引用。如果您將其替換爲實際構造函數的引用。

Add方法def Cons[A] = ::[A]Types一切都將工作得很好。

0

到限定def Cons[A] = ::[A]更好的選擇是val Cons = ::。這使得不只是寫Cons[B](head, this),但模式匹配

this match { 
    case Cons(x, t) => ... 
    case Nil => ... 
} 

,並獲得使用Cons::同伴對象上定義的任何其他方法。這也是斯卡拉標準庫does

type Map[A, +B] = immutable.Map[A, B] 
type Set[A]  = immutable.Set[A] 
val Map   = immutable.Map 
val Set   = immutable.Set