我正在閱讀Bernie Pope的幻燈片"Parser combinators in Scala"。他引用了「另類」的方法簽名類型Combinator的|
:「|」的返回類型在斯卡拉的解析器組合器中
def | [U >: T](q: => Parser[U]): Parser[U]
,問道:「家庭作業:爲什麼不呢|有這種類型改爲」
def | [U](q: => Parser[U]): Parser[Either[T,U]]
我正在閱讀Bernie Pope的幻燈片"Parser combinators in Scala"。他引用了「另類」的方法簽名類型Combinator的|
:「|」的返回類型在斯卡拉的解析器組合器中
def | [U >: T](q: => Parser[U]): Parser[U]
,問道:「家庭作業:爲什麼不呢|有這種類型改爲」
def | [U](q: => Parser[U]): Parser[Either[T,U]]
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
工作的代碼。
如果你的標記是固定的,就像這個例子中的每個標記一樣,你不需要把它們變成RE。只要放下「.r」位,你的解析器將在語義上相同,但不會打擾創建固定字符串RE模式和匹配器。 – 2009-12-18 21:23:22
謝謝,是的,回想起來這很明顯。我認爲是什麼讓我想起了這個想法,用「|」實現時,最終會丟失可能難以迴歸的類型信息 - 例如,Parser [Any]與Parser [Int [String]]相比,有些不太有用。經過反思,這不是一個真正的問題,因爲你只是安排它,以便替代品共享一個有用的共同結果超類型。 – 2009-12-18 21:45:22
謝謝,Randall。我原本使用「[mm] oe」.r,但認爲我只是混淆了這一觀點。正則表達式轉換是退化的。 – 2009-12-18 21:51:20
那麼,你期待我們爲你做功課嗎? :-)好的,這裏有一個提示......「a」的類型是什麼? 「B」'? – 2009-12-18 18:31:05