2009-12-18 87 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