Тип возврата "|" в синтаксических анализаторах Scala - PullRequest
2 голосов
/ 18 декабря 2009

Я читал слайды Берни Поупа по "Парсерные комбинаторы в Scala" . Он цитирует тип сигнатуры метода «альтернативного» комбинатора |:

def | [U >: T](q: => Parser[U]): Parser[U]

и спрашивает: «Домашнее задание: почему вместо этого нет этого типа?»

def | [U](q: => Parser[U]): Parser[Either[T,U]]

1 Ответ

1 голос
/ 18 декабря 2009
case class Stooge(name: String)
val moe: Parser[String] = "Moe"
val larry: Parser[String] = "Larry"
val curly: Parser[String] = "Curly"
val shemp: Parser[String] = "Shemp"

val stooge: Parser[Stooge] = (moe | larry | curly | shemp) ^^ { s => Stooge(s) }

Теперь представьте код, который вам нужно было бы написать вместо { s => Stooge(s) }, если бы вы работали с s: Either[Either[Either[String,String],String],String] вместо s: String.

...