Как это определение класса case позволяет сопоставлять шаблоны с инфиксами? - PullRequest
1 голос
/ 27 июня 2019

Я недавно написал парсер, используя библиотеку scala combinator .Я решил, что мне было интересно узнать о реализации, и пошел копать.

Пока читал код , я увидел, что при секвенировании ~ используется класс case для хранения левого и правого значений.

Прилагается следующий комментарий:

/** A wrapper over sequence of matches.
   *
   *  Given `p1: Parser[A]` and `p2: Parser[B]`, a parser composed with
   *  `p1 ~ p2` will have type `Parser[~[A, B]]`. The successful result
   *  of the parser can be extracted from this case class.
   *
   *  It also enables pattern matching, so something like this is possible:
   *
   *  {{{
   *  def concat(p1: Parser[String], p2: Parser[String]): Parser[String] =
   *    p1 ~ p2 ^^ { case a ~ b => a + b }
   *  }}}
   */
  case class ~[+a, +b](_1: a, _2: b) {
    override def toString = "("+ _1 +"~"+ _2 +")"
  }

Учитывая, что упомянутый код, безусловно, возможен, и что парсеры, определенные с помощью a ~ b, могут быть извлечены в значения с помощью { case a ~ b => ... }, какточно работает ли это un-application?Я знаю о методе unapply в scala, но здесь он не представлен.Классы случаев предоставляют один по умолчанию (я думаю, что да)?Если да, то как этот конкретный класс дел становится case a ~ b, а не case ~(a,b)?Это шаблон, который может быть использован программистами Scala?

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