自定义读取功能的模式匹配

时间:2010-04-01 22:44:19

标签: parsing haskell

我正在为我的模块中的一种数据类型编写自定义读取函数。例如,当我read "(1 + 1)" :: Data时,我希望它返回Plus 1 1。我的数据声明是data Data = Plus Int Int。感谢

3 个答案:

答案 0 :(得分:6)

这听起来像是一个更适合解析器的东西; Parsec是一个功能强大的Haskell解析器组合库,我建议这样做。

答案 1 :(得分: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

答案 2 :(得分:2)

您可以使用GHC的ReadP