Каким образом Scala's Option является катаморфизмом?

Ответ на этот вопрос предполагает, что метод сворачивания в Option в Scala это катамопризм. Из википедии катамофизм - это «уникальный гомоморфизм исходной алгебры в некоторую другую алгебру. концепция была применена к функциональному программированию как складки ». Это кажется справедливым, но приводит меня к начальной алгебре в качестве исходного объекта в категории F-алгебры.

Итак, если складка на Option действительно является катамофизмом, необходим некоторый функтор F, чтобы создать категорию F-алгебр, где Option будет исходным объектом. Я не могу понять, что это за функтор.

Для списков типа A функтором F является F[X] = 1 + A * X. Это имеет смысл, потому что List является рекурсивным типом данных, поэтому, если X равно List[A], то выше указано, что список типа A является либо пустым списком (1), либо (+) парой (*) A и List[A] . Но Option не рекурсивен. Option[A] будет просто 1 + A (Ничего или A). Так что я не понимаю, где находится функтор.

Чтобы быть ясным, я понимаю, что Option уже является функтором, поскольку он принимает от A до Option[A], но то, что делается для списков, отличается, A фиксирован, а функтор используется для описания того, как рекурсивно конструировать тип данных.

Кстати, если это не катаморфизм, его, вероятно, не следует называть складкой, поскольку это приводит к некоторому путаница.


person Patrick    schedule 18.05.2014    source источник
comment
На чем основано ваше предположение, что F должен быть рекурсивным? Многие алгебраические типы данных - нет. В любом случае всегда можно было схитрить и написать что-нибудь вроде F[X] = 1 + Const A X.   -  person Travis Brown    schedule 18.05.2014
comment
F[X] = 1 + Const A X то же самое, что и функтор, как F[X] = 1 + A? (Функтор, который отправляет каждый тип в Option [A].) Я полагаю, что это работает, но настолько тривиально, что я предполагал, что будет происходить еще больше. При этом F любая F-алгебра - это просто тип B с отображением из варианта [A] в B. Тогда начальность просто говорит, что для типа B и отображения из варианта [A] в B существует уникальное отображение от варианта [A] к B. домашние страницы. inf.ed.ac.uk/wadler/papers/free-rectypes/ (ссылка на википедию) также подразумевает, что точка исходных F-алгебр предназначена для рекурсивных типов данных.   -  person Patrick    schedule 18.05.2014
comment
Кроме того, если вы разрешаете постоянные функторы, то для любого типа T вы можете рассматривать функтор F[X] = T. Тогда F-алгебра - это просто тип B вместе с картой g от T до B. T - это непосредственно исходная алгебра, а катамофизм просто применяет g к объектам типа T. Кажется, именно это и происходит, поскольку вариант [A] является копродуктом A и Nothing, а карта от Option[A] до B разделяется на карту от A до B и карту от Nothing до B, которая соответствует сигнатуре типа fold по Option.   -  person Patrick    schedule 19.05.2014


Ответы (1)


Что ж, комментарии в правильном направлении. Я только новичок, поэтому у меня, наверное, есть некоторые заблуждения. Да, все дело в том, чтобы уметь моделировать рекурсивные типы, но я думаю, что ничто не препятствует созданию «нерекурсивной» F-алгебры. Поскольку исходная алгебра является решением уравнения X ~ = F X с "наименьшей фиксированной точкой". В случае Option решение тривиально, так как здесь нет рекурсии :)

Другие примеры исходных алгебр:

List [X] = 1 + A * X для представления list = Nil | Минусы список

Дерево [X] = A + A * X * X для представления дерева = Leaf a | Узел дерево дерево

Таким же образом:

Option [X] = 1 + A для обозначения option = None | Некоторые

Обоснование существования «постоянного» функтора довольно просто. Как представить узел дерева? Фактически, для алгебраического моделирования (простых) рекурсивных типов данных вам понадобятся только следующие функторы:

  • U (единица измерения, означает пустой)
  • K (постоянная, фиксирует значение)
  • Я (идентичность, представляет рекурсивную позицию)
  • * (продукт)
  • + (побочный продукт)

Я нашел хороший справочник: Функциональное универсальное программирование.

Бесстыдный плагин: я играю с этими концепциями в коде в scala-reggen

person GClaramunt    schedule 08.07.2014