程式語言學習心得 5
pOneOrMoreWithSep
和 pSat
都很平常,要把 pZeroOrMore
和 pOneOrMoreWithSep
中多餘的可能性清掉也很容易(只留比較長的結果就對了)。
pExpr
很長很苦工,好在有 Parser a
,讓 pExpr
的結構和 Expr a
的很相似。
有趣的是, Parser a
越來越像 applicative functor 。帶著 1992 年沒有的知識,現在我們知道該把 pApply
的參數位置調換一下:
pFmap :: (a -> b) -> Parser a -> Parser b
pFmap = flip pApply
而且還知道了將 function 放到 Parser
中的重要性:
pAp :: Parser (a -> b) -> Parser a -> Parser b
pAp pf p toks
= [ (f v, toks2) | (f, toks1) <- pf toks
, (v, toks2) <- p toks1
]
於是 pThen
, pThen3
等工具都能簡單造出來:
pThen :: (a -> b -> c) -> Parser a -> Parser b -> Parser c
pThen combine p1 p2 = combine `pFmap` p1 `pAp` p2
pThen3 :: (a -> b -> c -> d) -> Parser a -> Parser b -> Parser c -> Parser d
pThen combine p1 p2 p3 = combine `pFmap` p1 `pAp` p2 `pAp` p3
先這樣,今天要聽 ptrcmd 講「Rust 的記憶體安全機制: ownership, borrowing, 和 lifetime」,之後再來解決 pExpr
。