2010-07-19 44 views
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 dpNoParse(其中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 (..)仍然需要手動編碼),還是我做錯了什麼?

+0

順便說,「唯一的匹配構造函數」的規則,絕對是一件好事,因爲否則導入新頂層定義(比如說)可以大大改變一段代碼的語義! – 2010-07-22 18:14:44

回答

7

是的,你只能匹配文字。事實上,更好的方法來思考它是你只能匹配構造函數,並且恰巧Int,Char,String & co。都有字面構造函數。

請注意,您也可以混合使用情況和警衛並把它寫成(從內存中):

parserChar :: Char -> Parser Char 
parserChar c = Parser ch where 
    ch d = case dvChar d of 
     Parsed char dp | char == c -> Parsed char dp 
     _ -> NoParse