在递归方案中,我怎样才能用类型定义来构造一些东西,比如(Recursive t, CoRecursive t) -> t -> ? -> t
我尝试使用递归方案来更新节点。以列表为例,我可以想出两种方法:
update :: [a] -> Natural -> a -> [a]
update = para palg where
palg Nil _ _ = []
palg (Cons a (u, _)) 0 b = b : u
palg (Cons a (u, f)) n b = a : f (n-1) b
update' :: [a] -> Natural -> a -> [a]
update' = c2 (apo acoalg) where
c2 f a b c = f (a,b,c)
acoalg ([], _, _) = Nil
acoalg (_:as , 0, b) = Cons b $ Left as
acoalg (a:as , n, b) = Cons a $ Right (as, n-1, b)
但是,这两种实现都很好。在这两个实现中, 和 的构造函数ListF
出现[]
在等式的两边。而且这个定义似乎不是唯一的。有没有更好的方法来使用递归方案执行列表更新?