Если "Список" является моноидом, что его "набор"?
Просто прочитав книгу теории категорий и решил применить ее к haskell.
Автор определяет Monoid как:
Моноид - это набор L, снабженный двоичной операцией *: LxL- > L и отмеченным единичным элементом u в L, для которого и т.д.
Взяв структуру "Список" как моноид, ясно, что двоичная операция concat
, а единица - []
.
Но какое здесь множество М?
Я пробовал L = {set of all lists}
, но я думаю, что это приводит меня к неприятностям с "L в L?" вопрос, который, похоже, та же проблема, что и множества.
Или я что-то неправильно думаю?
EDIT: Как указано в @applicative, списки Haskell являются моноидами, называемыми Free monoids!
Ответы
Ответ 1
Вместо того, чтобы говорить, что "Список является моноидом", было бы более точным сказать "Для всех типов a тип [a]
является моноидом". Поэтому для любого конкретного типа a
ваш L будет L = {set of all lists of as}
. И с этим определением L может, конечно, не содержать себя.
Ответ 2
Для любого типа t
вы можете иметь это
L = all elements of the type [t]
то L является моноидом тривиально, используя ++
. Фактически, мы оформляем это в Haskell
class Monoid m where
mempty :: m
mappend :: m -> m -> m
это "класс" типов, которые имеют необходимые операции для формирования моноида, поэтому
instance Monoid [a] where
mempty = []
mappend a b = a ++ b
на самом деле, это известно как "свободный моноид на a"