caasih.net

程式語言學習心得 5

pOneOrMoreWithSeppSat 都很平常,要把 pZeroOrMorepOneOrMoreWithSep 中多餘的可能性清掉也很容易(只留比較長的結果就對了)。

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

Isaac Huang 發佈於