Entry tags:
Коалгебры и анаморфизмы
Предыдущие посты этой серии:
1. Типы как неподвижные точки функторов
2. Алгебры и катаморфизмы
( Анаморфизмы и коалгебры ко-под ко-катом ... )
1. Типы как неподвижные точки функторов
2. Алгебры и катаморфизмы
-- конструктор типа data Rec f = In (f (Rec f)) -- тип конструктора данных In :: f (Rec f) -> Rec fмы научились представлять любые рекурсивные типы, скажем
-- классическая запись рекурсивного типа data Nat = Z | S Natкак неподвижные точки функторов
-- добавляем параметр под рекурсию ... data N c = Z | S c -- ... делаем функтором ... instance Functor N where fmap g Z = Z fmap g (S x) = S (g x) -- ... и получаем альтернативную запись рекурсивного типа Nat type Nat = Rec N(Говоря про любые рекурсивные типы, я пока оставляю за скобками экспоненциальные, то есть со стрелками внутри конструктора данных.)
fac n = if n == 0 then 1 else n * fac (n-1)
-- нерекурсивный хэлпер fac' f n = if n == 0 then 1 else n * f (n-1) -- рекурсия здесь fac = fix fac'
fix f = f (fix f)
data Rec f = In (f (Rec f))
In :: f (Rec f) -> Rec f