我正在使用 Parsec 為日志檔案撰寫決議器。該日志檔案的每一行都遵循一個通用結構A:B:C:D,組件 A、B、C 和 D 遵循簡單的規則。我已經為每個組件撰寫了決議器,我想將它們組合成一個決議器。我目前的方法有效,但我覺得必須有一個更好的解決方案。一個直接的缺點是它不能很好地擴展包含超過 4 個組件的日志檔案。
parser :: (a -> b -> c -> d -> e) -> Parser a -> Parser b -> Parser c -> Parser d -> Parser e
parser f pa pb pc pd = f <$> pa <* (char ':') <*> pb <* (char ':') <*> pc <* (char ':') <*> pd
我搜索了一個合適的決議器組合器,但唯一接近的組合器是sepBy,它不適用于這個用例。任何幫助表示贊賞!
uj5u.com熱心網友回復:
我認為最好的選擇是引入您自己的運營商,例如:
infixl 4 <:>
p <:> q = p <* char ':' <*> q
那么你不需要定義一個單獨的parse函式,只需撰寫實作一樣簡單:
myParser = f <$> pa <:> pb <:> pc <:> pd
這很容易擴展:
myParser2 = g <$> pa <:> pb <:> pc <:> pd <:> pe
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/363859.html
