The Origami style is based around the idea that datatypes are fixpoints of shape functors.(
сегодняшний LtU)
Про всё заявленное в теме не напишу, а про это - напишу :)
Общеизвестное :)Обычная рекурсия
fac n = if n == 0
then 1
else n * fac (n-1)
может быть выражена через комбинатор неподвижной точки fix:
-- нерекурсивный хэлпер
fac' f n = if n == 0
then 1
else n * f (n-1)
-- рекурсия здесь
fac = fix fac'
Комбинатор неподвижной точки определен так:
fix f = f (fix f)
Аналог fix для типовА теперь - от обыденного к прекрасному! ;) Можно написать аналог fix для типов:
data Rec f = In (f (Rec f))
где тип f должен быть, ясен пень, полиморфно параметризован (а для дальнейших вкусностей ещё и instance Functor).
Тип конструктора данных для типа Rec
In :: f (Rec f) -> Rec f
дает понять, что это - действительно fix уровня типов.
Теперь мы можем выразить все обычные рекурсивные типы как фиксированные точки функторов.
( Примеры под катом... )Ссылки:
Bananas in Space - классика жанра :)
Origami programmingParametric Datatype-Genericity - сегодняшняя новинка (must read!)