Играем с Нат без тематических занятий
Я просто создаю определение в 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"
}
И для определения Сукка я стараюсь не использовать класс 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)
^
Я делаю явный метод для получения 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)
}
Зачем?
1 ответ
Решение
Аргументы конструктора видны только внутри класса. Если вы хотите сделать это поле, вы должны будете сказать так:
class Succ(val x: Nat) extends Nat { … }
// ^^^