2010-04-01 29 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