私は現在、抽象構文木を扱い、規則に従って変換する必要がある(具体的なことは重要ではない)サイドプロジェクトについては作業中です。複雑なASTの再帰を考慮する
AST自体は重要ではありません。つまり、一部の種類に限定されたサブ表現があることを意味します。 (例えばオペレータA
は唯一のタイプB
である引数ではなく、任意のExpr
を取る必要があり、私のデータ型の大幅簡素化縮小版は、次のようになります。
data Expr = List [Expr]
| Strange Str
| Literal Lit
data Str = A Expr
| B Expr
| C Lit
| D String
| E [Expr]
data Lit = Int Int
| String String
私の目標は、明示的な再帰を考慮し、依存することです私はしなかった場合は
data ExprF a = List [a]
| Strange (StrF a)
| Literal (LitF a)
data StrF a = A a
| B a
| C (LitF a)
| D String
| E [a]
data LitF a = Int Int
| String String
:。私のAST上で動作するように非常に強力な汎用的なツールを提供thesetwo優れたブログの記事、で示されるように、代わりに再帰スキームに必要な因数分解を適用すると、我々は、で終わります混乱、type Expr = Fix ExprF
は、前に定義したExpr
と同形でなければなりません。私はよく入力する必要cata
ためStr :: ExprF a
の内側パターンマッチB a :: StrF a
に持っているよう
しかし、これらのケースのためcata
を書くことは、かなり大変な作業となります。元のAST全体では、これは実行不可能です。
私は3210に遭遇しましたが、それは私の問題の解決策だと思われますが、複製された高次タイプのクラスなどのユーザーに不愉快なインターフェースは非常に不必要な定型文です。
だから、私の質問を総括します
- はGADTとしてASTこれについて移動するための正しい方法を書き換えていますか?
- 「はい」の場合、このサンプルをどのようにしてうまく動作するバージョンに変換できますか? 2番目の注記では、GHCでより高い種別の
Functor
が現在サポートされていますか?