`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` 。
