言語Xでファイルを解析したいとします。本当に、私はその中の情報のほんの一部にしか興味がありません. その目的のために、Haskell の多くの eDSL の 1 つ (Megaparsec など) でパーサーを書くのは簡単です。
data Foo = Foo Int -- the information I'm after.
parseFoo :: Parsec Text Foo
parseFoo = ...
それはすぐに関数を生じさせますgetFoo :: Text -> Maybe Foo
。
しかし、今は情報のソースも変更Foo
したいと思います。つまり、基本的に実装したいです
changeFoo :: (Foo -> Foo) -> Text -> Text
プロパティで
changeFoo id ≡ id
getFoo . changeFoo f ≡ fmap f . getFoo
パーサーの結果をレンズのようなものに変更することでそれを行うことができます
parseFoo :: Parsec Text (Foo, Foo -> Text)
parseFoo = ...
しかし、それは定義を非常に面倒なものにします。関連性のない情報をただ単に見過ごすことはできず、すべてのstring
サブパースの一致を保存し、手動で再構築する必要があります。
これは、文字列の再構築をStateT
パーサー モナドの周りのレイヤーに保持することである程度自動化できますが、既存のプリミティブ パーサーをそのまま使用することはできませんでした。
この問題に対する既存の解決策はありますか?