繁体   English   中英

Alex中的Haskell数据类型模式匹配

[英]Haskell data type pattern matching in Alex

假设我在Haskell中有这样的数据类型:

data Token = THEN AlexPosn
            | ELSE AlexPosn

从亚历克斯那里,我得到:

data AlexPosn = AlexPn !Int !Int !Int
    deriving (Eq,Show)

我可以像这样进行模式匹配:

eat_token :: Token -> [Token] -> [Token]
eat_token  (THEN p1)((THEN p2):rest) = rest
eat_token  (ELSE p1)((ELSE p2):rest) = rest

但是我真正想在这里完成的是:

eat_token  (_ p) tk2 = error "Syntax Error at:"++(show p)

但是,我得到:

Parse error in pattern.

有什么建议么?

每当您发现自己想要进行模式匹配而忽略这样的构造函数时,通常这是一个信号,表示您希望重构您的类型以具有新的枚举字段而不是旧的数据构造函数标签:

data Token = Token TokenType AlexPosn
data TokenType = THEN | ELSE

然后,您可以轻松地进行所需的模式匹配:

eat_token (Token _ p) tk2 = error $ "Syntax Error at: " ++ show p
eat_token  (_ p) tk2 = error "Syntax Error at:"++(show p)

Haskell不支持匿名构造函数(即,使用下划线模式匹配任何构造函数),即使数据类型的所有构造函数都具有相同的元素。

您可以在数据类型中使用记录字段,这将自动创建访问器函数:

data Token = THEN { src_pos :: AlexPosn }
           | ELSE { src_pos :: AlexPosn }

这将创建一个函数src_pos ,您可以像使用其他任何函数一样使用它:

eat_token tok ts2 = error "Syntax Error at: " ++ (show (src_pos tok))

顺便说一下,Alex(和Happy)并不是特别适合初学者。 如今,大多数人都使用Parsec / Attoparsec。 使用Parsec,您可以在Haskell中而不是在预处理器中编写解析代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM