В пакете recursion-schemes
можно выразить тот факт, что (строго-позитивный) тип алгебраических данных
- имеет функтор подписи,
f
- - начальная
f
-алгебра, а - является окончательной
f
-коалгеброй
Например, мы можем сделать это для [a]
со следующим кодом
-- (1) define and declare the signature functor, here called Base
data instance Prim [a] x = Nil | Cons a x deriving Functor
type instance Base [a] = Prim [a]
-- (2) demonstrate the initial algebra
instance Foldable [a] where
project [] = Nil
project (a:as) = Cons a as
-- (3) demonstrate the final coalgebra
instance Unfoldable [a] where
embed Nil = []
embed (Cons a as) = a:as
В частности, для любого типа, где мы имеем (1), (2) и (3), мы должны иметь, что (project, embed)
является изоморфизмом.
Я понимаю, что типы данных в целом (или, по крайней мере, строго-положительные) всегда являются конечными/начальными со/алгебрами какого-либо сигнатурного функтора - на самом деле они всегда оба.
Итак, мой вопрос: почему Foldable
и Unfoldable
являются отдельными классами? Когда тип данных будет только одним или другим?
В настоящее время я могу себе представить, что это может быть ценным для абстрактных типов данных, которые только хотят предоставить либо складной, либо разворачивающий интерфейс, но есть и другие времена?