4
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed c dp -> Parsed c dp
_ -> NoParse
匹配上述功能應該採取一個字符c
並返回一個分析器,其將只匹配c
。函數dvChar d
將返回Parsed char dp
或NoParse
(其中char
是字符串中的下一個字符)。因此,我曾希望Parsed c dp
只會匹配char==c
的結果,但實際發生的是由此函數返回的解析器匹配任意字符(即使c
似乎被綁定到某個特定的Char,作爲函數參數)。模式的相等
以下功能正常工作:
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed char dp -> if char == c then Parsed char dp else NoParse
_ -> NoParse
手動編碼解析器解析信'a'
也工作正常,在
case dvChar d of
Parsed 'a' dp -> Parsed 'a' dp
_ -> NoParse
將只返回成功,如果字符是'a'
。
那麼是什麼給?你是否只能用這樣的模式來匹配文字(例如,儘管Char在類Eq中,if char==c (..)
仍然需要手動編碼),還是我做錯了什麼?
順便說,「唯一的匹配構造函數」的規則,絕對是一件好事,因爲否則導入新頂層定義(比如說)可以大大改變一段代碼的語義! – 2010-07-22 18:14:44