以下scala代码有什么问题

时间:2016-10-27 15:13:23

标签: scala pattern-matching

我在下面的代码中遇到以下编译时错误

错误:(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
  }
}

3 个答案:

答案 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