簡體   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