阅读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
,其中包含的类型是将~
应用于T
和U
类型的参数的结果吗?
答案 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}
请注意,~>
会丢弃左侧。