我在下面的代码中遇到以下编译时错误
错误:(7,29)未找到:值缺点
def :: [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
}
}
答案 0 :(得分:2)
缺点是类型别名而不是值。它不能出现在值位置上。例如:
我对您的程序进行了一些修改以使其正常工作:
width:100%; max-height:100%; height:25px;
在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]
重载符号,这就是为什么它需要创建::
,否则Scala编译器认为我们正在尝试调用Types.cons
以下是REPL的一个例子:
List#::
请参阅表达式的类型scala> 3 :: Nil
res0: Types.Cons[Int] = ::(3,Nil$@46fd71)
scala> 3 :: 4 :: Nil
res1: Types.Cons[Int] = ::(3,::(4,Nil$@46fd71))
。
答案 1 :(得分:1)
原因是
object Types {
type Cons[A] = ::[A]
}
是类型的声明,但是
中的Cons
def ::[B >: A](head: B) = Cons[B](head, this)
是对构造函数的引用。如果你参考实际的构造函数替换它。
将方法def Cons[A] = ::[A]
添加到Types
,一切正常。
答案 2 :(得分:0)
定义def Cons[A] = ::[A]
的更好选择是val Cons = ::
。这不仅可以编写Cons[B](head, this)
,还可以编写模式匹配
this match {
case Cons(x, t) => ...
case Nil => ...
}
并使用::
名称访问Cons
随播广告对象上定义的任何其他方法。这也是Scala标准库does:
type Map[A, +B] = immutable.Map[A, B]
type Set[A] = immutable.Set[A]
val Map = immutable.Map
val Set = immutable.Set