lomeo: (лямбда)
[personal profile] lomeo
Когда я только разбирался с бананами, линзами и т.д. задача описания катаморфизма для розы:
data Rose a = Rose a [Rose a]

вызывала у меня большое затруднение.


Мы с [livejournal.com profile] mibori очень пытались понять, как это сделать правильно. Я там напутал со страшной силой. Вчера я разбирался с разными бла-морфизмами и то, как их получить, основываясь на их ТК определениях (initial F-algebra в нашем случае) - и я вдруг прозрел.

Всё оказывается очень просто. Пусть роза - это initial RA-algebra, которую мы назовём (μRA, in).

Во-первых, поскольку мы работаем с initial RA-algebra, наш тип должен быть этим самым функтором RA. С Rose так и есть:
instance Functor Rose where
    fmap f (Rose x xs) = Rose (f x) $ map f xs

Во-вторых, конструктор у розы всего один:
rose = in

поэтому нам нужна всего одна функция. Поскольку функтор RA определяется так:
RA(X) = A × LX(Y)

где LA - это функтор, относящийся к списку:
LA(X) = 1 + A × X

то получаем, что нам нужна функция
r : A × μLC -> C

μLC - это carrier LC-алгебры для списков.

Дальше. Катаморфизм есть уникальное решение (как следует из его universal property) следующего равенста:
(|φ|) . rose = r . (id × L(|φ|))

Самое сложное здесь - понять почему мы используем L(|φ|). Я пока понимаю это интуитивно, подстановкой в типе функции r.

Ну, и всё! :-)
foldRose r (Rose x xs) = r x (map (foldRose r) xs)

Теперь я чувствую, что работа с ТК приносит плоды. Могу, например, параморфизм расписать для розы, хе-хе. А ведь я ещё в самом начале ;-)

Date: 2009-02-03 03:54 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Да, мне хочется категорный подход увидеть.

Profile

lomeo: (Default)
Dmitry Antonyuk

September 2025

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 26th, 2026 11:04 pm
Powered by Dreamwidth Studios