Scala тематические классы и списки - PullRequest
4 голосов
/ 15 августа 2011

Я совершенно новичок в Scala. Сейчас я пытаюсь портировать парсер, который я написал в Standard ML, на Scala и у меня проблема со следующим кодом:

abstract class Token
case class Zero extends Token
case class At extends Token
//...

object Tokenizer {
  def tokenize(seq : List[Char]) : List[Token] = seq match {
    case List() => error("Empty input")
    case '0' :: rest => Zero :: tokenize(rest)
    case '@' :: rest => At :: tokenize(rest)
    //...
  }  
}

В SML мне не нужно объявлять тип возвращаемого значения метода tokenize (), но, похоже, Scala нуждается в нем, и он почему-то недоволен предоставленным мною типом (он жалуется на Zero, At - недопустимые типы и что вместо этого они должны быть типа Token). Обратите внимание, что я также хочу, чтобы patten соответствовал списку токенов в более поздний момент времени на этапе синтаксического анализа.

Я провел поиск в Интернете и в самом стековом потоке, чтобы выяснить, не поднимался ли ранее подобный вопрос (это выглядело так тривиально), но почему-то я ничего не смог найти. Я почти уверен, что у меня что-то не так, пожалуйста, просветите меня:)

Ответы [ 2 ]

9 голосов
/ 15 августа 2011

At и Zero являются классами, а не объектами, поэтому они сами не являются экземплярами Token.Вы можете исправить свой код, изменив значение с case class на case object:

case object Zero extends Token
case object At extends Token

Причина, по которой вам нужно указать тип возвращаемого значения функции, заключается в том, что компилятор Scala не может определить типрекурсивные функции, вы можете прочитать об этом здесь: Почему Scala требует тип возврата для рекурсивных функций?

8 голосов
/ 15 августа 2011

Если вы хотите создать новые экземпляры классов Zero и At, вам следует использовать фабричный метод apply для их создания (или new ключевое слово: new Zero), например, в Scala Zero() будет равно Zero.apply()):

case '0' :: rest => Zero() :: tokenize(rest)

Если вы пишете просто Zero (а не Zero()), тогда вы используете объект-компаньон класса Zero, который был автоматически создан компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...