私は書くだろう
integer :: Parser Integer
integer = read <$ many1 space <*> many1 digit
<$>
左連想 (アプリケーションのような) パーサー構築演算子, <*>
, <$
,がたくさんあります<*
。左端のものは、コンポーネントの値から結果の値を組み立てる純粋な関数のはずです。各演算子の右側にあるものはパーサーであり、文法の構成要素を左から右にまとめて与えます。どの演算子を使用するかは、次の 2 つの選択肢によって決まります。
the thing to the right is signal / noise
_________________________
the thing to the left is \
+-------------------
pure / | <$> <$
a parser | <*> <*
したがって、read :: String -> Integer
パーサーのセマンティクスを提供する純粋な関数として選択すると、先頭のスペースを「ノイズ」として分類し、数字の束を「シグナル」として分類できます。したがって、
read <$ many1 space <*> many1 digit
(..) (.........) (.........)
pure noise parser |
(.................) |
parser signal parser
(.................................)
parser
複数の可能性を組み合わせることができます
p1 <|> ... <|> pn
不可能を表現する
empty
パーサーでコンポーネントに名前を付ける必要はめったになく、結果のコードはセマンティクスが追加された文法のようになります。