假设我有以下 GADT AST:
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
在一个类中。