下面的scala代码有什么问题
我在下面的代码中遇到以下编译时错误 错误:(7,29)未找到:值 def::[B>:A](头:B)=Cons[B](头,这个) 原因是下面的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
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也有同样的问题tryTypes.Cons
。顺便说一句,您发布了错误的代码。在您的示例中,它是:[B](头,这个)
。@talex将编辑代码。同样,Type.Cons也有同样的问题