再帰スキームでは、次のような型定義で何かを構築するにはどうすればよいですか(Recursive t, CoRecursive t) -> t -> ? -> t
再帰スキームを使用してノードを更新しようとしています。リストを例にとると、次のような 2 つの方法を考え出すことができます。
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)
ただし、これら 2 つの実装は適切です。これら 2 つの実装では、コンストラクターListF
と[]
が方程式の両側に現れます。そして、定義は一意ではないようです。再帰スキームでリストの更新を実行するより良い方法はありますか?