Подтвердить что ты не робот

Почему алгебраический тип должен быть только исходной алгеброй (или наоборот)?

В пакете recursion-schemes можно выразить тот факт, что (строго-позитивный) тип алгебраических данных

  • имеет функтор подписи, f
  • - начальная f -алгебра, а
  • является окончательной f -коалгеброй

Например, мы можем сделать это для [a] со следующим кодом

-- (1) define and declare the signature functor, here called Base

data instance Prim [a] x = Nil | Cons a x deriving Functor
type instance Base [a] = Prim [a]

-- (2) demonstrate the initial algebra
instance Foldable [a] where
  project []     = Nil
  project (a:as) = Cons a as

-- (3) demonstrate the final coalgebra
instance Unfoldable [a] where
  embed Nil         = []
  embed (Cons a as) = a:as

В частности, для любого типа, где мы имеем (1), (2) и (3), мы должны иметь, что (project, embed) является изоморфизмом.

Я понимаю, что типы данных в целом (или, по крайней мере, строго-положительные) всегда являются конечными/начальными со/алгебрами какого-либо сигнатурного функтора - на самом деле они всегда оба.

Итак, мой вопрос: почему Foldable и Unfoldable являются отдельными классами? Когда тип данных будет только одним или другим?

В настоящее время я могу себе представить, что это может быть ценным для абстрактных типов данных, которые только хотят предоставить либо складной, либо разворачивающий интерфейс, но есть и другие времена?

4b9b3361

Ответ 1

Это может быть не ответ на ваш вопрос, но на самом деле не так, что строго положительные типы данных Haskell являются исходными алгебрами. Причиной этого является то, что даже в общем подмножестве Haskell (с которым мы хотим работать, когда рассуждаем!) У вас есть бесконечные данные.

Например, сложение бесконечного списка является частичным.