次のGADTASTがあるとします。
data O a b c where
Add :: O a a a
Eq :: O a b Bool
--... more operations
data Tree a where
N :: (O a b c) -> Tree a -> Tree b -> Tree c
L :: a -> Tree a
次に、ツリー内L
のタイプのすべての(軒)を置き換える関数を作成します。次のようになります。a
f :: a -> Tree b -> Tree b
f x (L a) | typeof x == typeof a = L x
f x (L a) = L a
f x (N o a b) = N o (f x a) (f x b)
そのような関数を構築することは可能でしょうか?(多分クラスを使用しますか?)GADTに変更が加えられた場合、それは可能でしょうか?
私はすでにtypeof関数を持っています:typeof :: a -> Type
クラス内。