Я недавно написал парсер, используя библиотеку 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?