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