了解Parser Combinator~输出

时间:2014-01-08 16:48:26

标签: scala

阅读DSLs in Action,我看到Sequential Combinator的代码:

def ~ [U](p: => Parser[U]): Parser[~[T, U]] =
(for(a <- this; b <- p) yield new ~(a,b)).named("~")

返回类型的含义是什么:Parser[~[T, U]]

返回类型是Parser,其中包含的类型是将~应用于TU类型的参数的结果吗?

1 个答案:

答案 0 :(得分:4)

类型~基本上是一种允许使用中缀表示法的元组类型。因此,问题中返回的解析器会解析与(T,U)同构的类型。中缀表示法允许编写以下内容:

def intParser: Parser[Int] = ???
def intPair: Parser[~[Int,Int]] = intParser ~ intParser
def product: Parser[Int] = intPair ^^ {case f1 ~ f2 => f1 * f2}

或者在一行中,通常是这样做的:

def product: Parser[Int] = intParser ~ intParser ^^ {case f1 ~ f2 => f1 * f2}

或者可能更加理智,数字用*分隔:

def product: Parser[Int] = intParser ~ ("*" ~> intParser) ^^ {case f1 ~ f2 => f1 * f2}

请注意,~>会丢弃左侧。