我只是在Scala中为Naturals创建一个定义,还有一个PLUS操作:
abstract class Nat {
def +(other:Nat):Nat = this match {
case Zero => other
case Succ(x) => x + Succ(other)
}
}
object Zero extends Nat {
override def toString = "Zero"
}
对于Succ的定义,我尝试不使用Case类,用于学习目的。我的第一个方法是:
class Succ(x: Nat) extends Nat {
override def toString = "Succ(" + x.toString + ")"
}
object Succ {
def apply(x: Nat) = new Succ(x)
def unapply(s: Succ) = Some(s.x)
}
但是编译器抛出了一个错误
Error:( , ) value x is not a member of Succ
def unapply(s: Succ) = Some(s.x)
^
我为get X制作了一个显式方法,它可以正常工作
class Succ(x: Nat) extends Nat {
def getX = x
override def toString = "Succ(" + x.toString + ")"
}
object Succ {
def apply(x: Nat) = new Succ(x)
def unapply(s: Succ) = Some(s.getX)
}
为什么?
答案 0 :(得分:2)
构造函数参数仅在类中可见。如果你想让它成为一个领域,你必须这样说:
class Succ(val x: Nat) extends Nat { … }
// ^^^