私は Template Haskell で遊んでいます。レコードのデフォルトの初期化子を作成できる準クォーターを作成したい、つまり次のようなもの
[record| data Config = { shouldDoX = True; featureY :: Integer, optionZ = Nothing } |]
関数を作成する必要があります
defaultConfig = Config { shouldDoX = True, optionZ = Nothing }
基本的にはデータ宣言と同じ構文で、デフォルト値で拡張されています。現在record
はカスタムの QuasiQuoter ですが、内部には自分自身を解析したくない式と型があります。理想的には、中括弧内のブロックをステートメントに分割し、 and を探すだけで済み=
ます::
。
[e| ...|]
そこで、 orで引用するのと同じことを効果的に行う関数を探してい[t| ...|]
ます。Hoogle で関数を検索しましたが、何String -> ExpQ
もString -> Q Exp
見つかりませんでした。
私が何を探しているのかよくわからなかった場合:私は QuasiQuoters について知っています。私が述べたように:record
はQuasiQuoter です。準クォーターに渡される文字列には、式 ( などNode 7 (Node 8 Nil Nil) Nil
) とタイプ (True
またはなど) が含まれていMaybe (Either A B)
ます。私はこれらを自分で解析できますが、文字列を のような引用符に渡したのと同じように、それを実行する関数があることを願っています[e|...|]
。
だから:式を文字列として、またはタイプを文字列としてフィードでき、適切なExp
またはType
オブジェクトを返す関数を探しています。コンテキストに基づいて式または型を評価する必要があるため(引用と同じように)、Qモナドに存在する必要があると思います。
functionOfMyDreams "Node 7 (Node 8 Nil Nil) Nil" :: Q Exp