Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下面的scala代码有什么问题_Scala_Pattern Matching - Fatal编程技术网

下面的scala代码有什么问题

下面的scala代码有什么问题,scala,pattern-matching,Scala,Pattern Matching,我在下面的代码中遇到以下编译时错误 错误:(7,29)未找到:值 def::[B>:A](头:B)=Cons[B](头,这个) 原因是 object Types { type Cons[A] = ::[A] } 是类型的声明,但在 def ::[B >: A](head: B) = Cons[B](head, this) 是对构造函数的引用。如果用实际构造函数的引用替换它 将方法def Cons[A]=::[A]添加到类型中,所有方法都可以正常工作。原因是 object Types

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

错误:(7,29)未找到:值

def::[B>:A](头:B)=Cons[B](头,这个)

原因是

object Types {
  type Cons[A] = ::[A]
}
是类型的声明,但在

def ::[B >: A](head: B) = Cons[B](head, this)
是对构造函数的引用。如果用实际构造函数的引用替换它

将方法
def Cons[A]=::[A]
添加到
类型
中,所有方法都可以正常工作。

原因是

object Types {
  type Cons[A] = ::[A]
}
是类型的声明,但在

def ::[B >: A](head: B) = Cons[B](head, this)
是对构造函数的引用。如果用实际构造函数的引用替换它

将方法
def Cons[A]=::[A]
添加到
Types
中,所有方法都可以正常工作。

Cons是类型别名,而不是值。它不能发生在值位置上。例如:

我对您的程序进行了一些修改以使其正常工作:

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]
说明了类型别名的一个正确用例

程序的另一个问题是在同一作用域中存在两个重载符号:,这就是为什么它需要创建
类型.cons
,否则Scala编译器认为我们正在尝试调用
列表:

以下是REPL中的一个示例:

scala> 3 :: Nil
res0: Types.Cons[Int] = ::(3,Nil$@46fd71)

scala> 3 :: 4 :: Nil
res1: Types.Cons[Int] = ::(3,::(4,Nil$@46fd71))
请参见表达式的类型是
Cons[Int]

Cons是类型别名而不是值。它不能发生在值位置上。例如:

我对您的程序进行了一些修改以使其正常工作:

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]
说明了类型别名的一个正确用例

程序的另一个问题是在同一作用域中存在两个重载符号:,这就是为什么它需要创建
类型.cons
,否则Scala编译器认为我们正在尝试调用
列表:

以下是REPL中的一个示例:

scala> 3 :: Nil
res0: Types.Cons[Int] = ::(3,Nil$@46fd71)

scala> 3 :: 4 :: Nil
res1: Types.Cons[Int] = ::(3,::(4,Nil$@46fd71))

查看表达式的类型是
Cons[Int]

定义
def Cons[A]=:[A]
的更好的替代方法是
val Cons=::
。这不仅允许写入
Cons[B](head,This)
,而且允许模式匹配

this match {
  case Cons(x, t) => ...
  case Nil => ...
}
并使用
Cons
名称访问在
伴随对象上定义的任何其他方法。这也是Scala标准库的功能:


定义
def Cons[A]=:[A]
的更好的替代方法是
val Cons=::
。这不仅允许写入
Cons[B](head,This)
,而且允许模式匹配

this match {
  case Cons(x, t) => ...
  case Nil => ...
}
并使用
Cons
名称访问在
伴随对象上定义的任何其他方法。这也是Scala标准库的功能:


尝试
Types.Cons
。顺便说一句,您发布了错误的代码。在您的示例中,它是
:[B](头,这个)
。@talex将编辑代码。同样,Type.Cons也有同样的问题try
Types.Cons
。顺便说一句,您发布了错误的代码。在您的示例中,它是
:[B](头,这个)
。@talex将编辑代码。同样,Type.Cons也有同样的问题