Гиломорфизм (информатика) - Hylomorphism (computer science) - Wikipedia
В Информатика, и в частности функциональное программирование, а гиломорфизм это рекурсивный функция, соответствующая сочинение из анаморфизм (который сначала создает набор результатов; также известный как «разворачивание»), за которым следует катаморфизм (который затем складки эти результаты в финал возвращаемое значение ). Объединение этих двух рекурсивных вычислений в единый рекурсивный шаблон позволяет избежать построения промежуточной структуры данных. Это пример вырубка леса, стратегия оптимизации программы. Связанный тип функции - это метаморфизм, который представляет собой катаморфизм, за которым следует анаморфизм.
Формальное определение
Гиломорфизм может быть определен с точки зрения его отдельных анаморфических и катаморфических частей.
Анаморфная часть может быть определена в терминах унарный функция определение списка элементов в повторным применением ("разворачивающийся"), а предикат обеспечение условия завершения.
Катаморфическую часть можно определить как комбинацию начального значения для свертки и двоичного оператор используется для выполнения складки.
Таким образом, гиломорфизм
могут быть определены (предполагая соответствующие определения & ).
Обозначение
Сокращенное обозначение вышеупомянутого гиломорфизма: .
Гиломорфизмы на практике
Списки
Списки являются общими структурами данных, поскольку они естественным образом отражают линейные вычислительные процессы. Эти процессы возникают в повторяющихся (итеративный ) вызовы функций. Поэтому иногда необходимо создать временный список промежуточных результатов, прежде чем сводить этот список к одному результату.
Одним из примеров часто встречающегося гиломорфизма является канонический факториал функция.
факториал :: Целое число -> Целое числофакториал п | п == 0 = 1 | п > 0 = п * факториал (п - 1)
В предыдущем примере (написанном на Haskell, а чисто функциональный язык программирования ) видно, что эта функция, примененная к любому заданному допустимому входу, будет генерировать линейное дерево вызовов изоморфный в список. Например, учитывая п = 5 он выдаст следующее:
факториал 5 = 5 * (факториал 4) = 120 факторный 4 = 4 * (факториал 3) = 24 факторный 3 = 3 * (факториал 2) = 6 факторный 2 = 2 * (факториал 1) = 2 факторный 1 = 1 * (факториал 0) = 1факторный 0 = 1
В этом примере анаморфной частью процесса является создание дерева вызовов, которое изоморфно списку. [1, 1, 2, 3, 4, 5]
. Таким образом, катаморфизм - это расчет товар из элементы этого списка. Таким образом, в обозначениях, данных выше, факториальная функция может быть записана как куда и .
Деревья
Однако термин «гиломорфизм» не применяется только к функциям, действующим на изоморфизмы списков. Например, гиломорфизм также можно определить путем создания нелинейного дерева вызовов, которое затем сворачивается. Примером такой функции является функция для генерации пth срок из Последовательность Фибоначчи.
Фибоначчи :: Целое число -> Целое число Фибоначчи п | п == 0 = 0 | п == 1 = 1 | п > 1 = Фибоначчи (п - 2) + Фибоначчи (п - 1)
Эта функция, снова применяемая к любому допустимому вводу, сгенерирует нелинейное дерево вызовов. В примере справа дерево вызовов, созданное с применением Фибоначчи
функция на входе 4
.
На этот раз анаморфизм - это генерация дерева вызовов, изоморфного дереву с листовые узлы 0, 1, 1, 0, 1
и катаморфизм суммирование этих листовых узлов.
Смотрите также
- Морфизм
- Морфизмы F-алгебры
- От начальной алгебры к алгебре: Катаморфизм
- От коалгебры к окончательной коалгебре: Анаморфизм
- Расширение идеи катаморфизмов: Параморфизм
- Расширение идеи анаморфизмов: Апоморфизм
Рекомендации
- Эрик Мейер; Маартен Фоккинга; Росс Патерсон (1991). «Функциональное программирование с бананами, линзами, конвертами и колючей проволокой» (PDF). С. 4, 5.