myの名前 (階層識別子を表す) を、モナドの非表示状態として保持されるシンボル テーブルの名前 (整数)rename
に置き換える関数を書きたいと考えています。String
AST
GUID
Renamer
名前のAST a
型でパラメータ化された型があります。AST のリーフにある名前のタイプは次のName a
とおりです。
data Name a = Name a
これにより、SYB トランスフォーマーでそれらを簡単にターゲットにすることができます。
パーサーは次のように入力されます (簡潔にするためにエラーの可能性は無視します)。
parse :: String -> AST String
rename
関数を次のように入力します。
rename :: AST String -> Renamer (AST GUID)
SYB を使用して、トランスフォーマーを使用してすべてName String
のを にName GUID
変換することは可能ですか?
resolveName :: Name String -> Renamer (Name GUID)
からの他のすべての値は、子c String
をc GUID
変換し、同じコンストラクターを使用して貼り付けますが、型パラメーターは異なりますか?
everywhereM
関数は私が望むものに近いですが、変換はできますが、変換はできませc a -> m (c a)
んc a -> m (c b)
。
私のフォールバックソリューション(定型文を手で書く以外)は、型パラメータを から削除し、次のようAST
に定義するName
ことです:
data Name = StrName String
| GuidName GUID
名前の変更が入力されるように:
rename :: AST -> Renamer AST
で動作させるeverywhereM
。ただし、これにより、名前が変更された後も an が 's をAST
保持している可能性が残ります。型システムを使用して、名前が変更されたものは名前しか保持できないStrName
という事実を正式に把握したかったのです。AST
GUID