2010-04-01 30 views
1

我正在爲我的模塊中的一種數據類型編寫自定義閱讀功能。例如,當我做read "(1 + 1)" :: Data時,我想讓它返回Plus 1 1。我的數據聲明是data Data = Plus Int Int。謝謝自定義閱讀功能的模式匹配

+0

我不確定這裏的問題是什麼。你的話題提到了模式匹配,但問題的主體卻沒有。你說你正在編寫一個自定義閱讀功能,但是你沒有說你遇到了哪個問題。 – sepp2k 2010-04-01 22:53:02

+0

問題是我想用字符串做一些模式匹配。例如:如果字符串是「(1 + 1)」,那麼它將返回加1 1。如果它是「(2 - 1)」,則它返回減號2 1.操作符可以是+ - * /。操作數可以是任何整數。但操作符必須以空格爲界,並且必須有括號括住整個表達式。 – altair211 2010-04-01 23:11:44

回答

6

這聽起來像是更適合解析器的東西; Parsec是一個功能強大的Haskell解析器組合庫,我會推薦它。

3

我想介紹一下使用解析器的概念。但是,如果您絕對必須使用模式匹配,請執行如下操作:

import Data.List 

data Expr = Plus Int Int | Minus Int Int deriving Show 

test = [ myRead "(1 + 1)", myRead "(2-1)" ] 

myRead = match . lexer 
    where 
    match ["(",a,"+",b,")"] = Plus (read a) (read b) 
    match ["(",a,"-",b,")"] = Minus (read a) (read b) 
    match garbage   = error $ "Cannot parse " ++ show garbage 

lexer = unfoldr next_lexeme 
    where 
    next_lexeme "" = Nothing 
    next_lexeme str = Just $ head $ lex str