私はHaskellのモジュールの構造を反映し、さまざまな種類のが定義されているLanguage.Exts.Annotated.Syntax、からの値を扱うコードを書いている:は定型の回避
data Module l = ...
data Decl l = ...
data Exp t = ...
-- etc
私がしたいですこれらのデータ構造を歩き回り、さまざまな変換を実行する関数を書くことができるようになりました。共通のデータ型はないので、すべてを行う関数を書くことはできません。私は今取る多くのコードを書いて自分自身を見つけることだが
data Tree l = ModuleT (Module l)
| DeclT (Decl l)
| ExpT (Exp l)
-- etc copy & paste
:これまでのところ、私は私の変換関数はTree l -> Tree l
を行うことができますように、これらのタイプのそれぞれをラップTree
タイプを書いた
Module
は、ModuleT
をラップして関数を呼び出し、結果を再びModule
にアンラップします。私が持っている:
class AnnotatedTree ast where
tree :: ast l -> Tree l
untree :: Tree l -> ast l
instance AnnotatedTree Module where
tree = ModuleT
untree (ModuleT x) = x
untree _ = error "expected ModuleT"
-- etc ad nauseam
つの質問:
- 私は、Language.Exts.Annotated.Syntaxで種類を変更することはできません私はこのことについて間違った道を進んでいますことを考えると?
- そうでなければ、この定型文を何とか切り捨てることはできますか?
ユニプレートは、私が必要としていたもののようです。私は今、私の定型文を廃止しました。 –
このアプローチでは、もはや本当にあなたのツリータイプは必要ありませんか? – Martijn
そうです、私はそうではありません。ツリーリライト機能は、私が気にするタイプごとに1つのrewriteBiアプリケーションのシリーズとして設定できます。 –