パーサーコンビネーターは、入力文字列を受け取り、解析された値と未処理の残りの文字列を返す関数です。Parser<T> は (input: string) => [T, string] として定義されます。例えば、p Integer は "10 20 30" を数値 10 と残り " 20 30" に解析します。p Hello は "Hello 100" から "Hello" を取り出し、" 100" を残します。p Ignore Whitespace は空白を消費し、" " と "100" を返します。その後 p Integer が "100" を数値 100 と空文字列に解析します。
p Seq のようなシーケンスコンビネーターを使うと、パーサーを組み合わせられます。p Seq(p Hello, p Ignore Whitespace, p Integer) は "Hello 100" をタプル ["Hello", null, 100] に解析します。p Map コンビネーターは解析値を変換し、例えば ["Hello", null, 100] を {greeting: "Hello", who: 100} に変換します。同様に、p Seq(p Number, p Semicolon) は "10;20;30;" を、数値とセミコロンの組を繰り返し消費することで数値のリストに解析します。
本記事では、ネットワークの ping コマンドの出力を解析する例も紹介し、これらのコンビネーターを使って生のテキストから構造化データを抽出する方法を示しています。fold と unfold の操作は、パーサーが値を畳み込んだり再構築したりできることを示しており、例えばリストの合計を求めたり、"Hello 100" を ["Hello", " ", 100] に変換したりその逆を行ったりします。
出典: Hacker News · 要約:HeadlinesBriefing