假设我有一个简单的GADT。
data Expr a where
Int' :: Integer -> Expr Int
Fun :: Text -> Expr a
(:*) :: Expr (a -> b) -> Expr a -> Expr b
现在,我可以对其定义以下遍历方式:
transform :: Applicative f => (forall b. Expr b -> f (Expr b)) -> Expr a -> f (Expr a)
transform f (a :* b) = (:*) <$> transform f a <*> transform f b
transform f v = f v
这个类型看起来非常像镜头中的Traversal
。 但是并不完全相同,它的级别更高。
我仍然可以定义“传统”的set
和over
。 view
更加复杂,有一些需要避免的障碍(包括无法确定的类型),但是可行。
这种构造有一个名称吗? 它是否得到现有的镜头库支持或研究?