2009-12-18 85 views
2

我正在阅读Bernie Pope的幻灯片"Parser combinators in Scala"。他引用了“另类”的方法签名类型Combinator的|“|”的返回类型在斯卡拉的解析器组合器中

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

,问道:“家庭作业:为什么不呢|有这种类型改为”

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

那么,你期待我们为你做功课吗? :-)好的,这里有一个提示......“a”的类型是什么? “B”'? – 2009-12-18 18:31:05

回答

1
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工作的代码。

+0

如果你的标记是固定的,就像这个例子中的每个标记一样,你不需要把它们变成RE。只要放下“.r”位,你的解析器将在语义上相同,但不会打扰创建固定字符串RE模式和匹配器。 – 2009-12-18 21:23:22

+0

谢谢,是的,回想起来这很明显。我认为是什么让我想起了这个想法,用“|”实现时,最终会丢失可能难以回归的类型信息 - 例如,Parser [Any]与Parser [Int [String]]相比,有些不太有用。经过反思,这不是一个真正的问题,因为你只是安排它,以便替代品共享一个有用的共同结果超类型。 – 2009-12-18 21:45:22

+0

谢谢,Randall。我原本使用“[mm] oe”.r,但认为我只是混淆了这一观点。正则表达式转换是退化的。 – 2009-12-18 21:51:20