構成ファイル用のパーサーを作成しようとしていますが、パーサーがフリーズするという奇妙なエラーが発生します。コードはここで見ることができます。デバッガーで実行しましたが、次の行で発生するようです
p_server_entry = many settings *> pure ()
「純粋な()」の評価で。つまり、デバッガーの動作が信頼できる場合、p_server_entry から戻ろうとすると失敗するようです。「pure ()」ステートメントを削除して、単純に「[()]」を返そうとしました (そして明らかに型シグネチャを調整しました) が、同じ場所でハングしているようです。Parsec が左再帰をサポートしていないことは知っていますが、ここでそれが行われているとは思いませんか?
私がやっていることは、Parsec を使用して、ユーザー状態を介してレコードを入力することです。戻り値については、構成レコードが状態から取得され、解析の結果として返されるため、すべての関数から () を返すだけです。ハングの原因となるファイルの例は次のとおりです。
[server]
port = 80
これをテストするには、ghci で Parser.hs ファイルを実行し (ただし、プログラムをコンパイルして実行しても同じ結果が得られます)、次のようにします。
:m + Data.Monoid
parseConfigFile "test.config" mempty
どなたでもご協力いただければ幸いです。
編集:これは以前とほぼ同じように機能していたことに言及する必要があります。特別な解析ツリーを返すことから、単純に構成構造を直接更新することに変更しました。