Играем с Нат без тематических занятий

Я просто создаю определение в 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 { … }
//         ^^^
Другие вопросы по тегам