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

Если "Список" является моноидом, что его "набор"?

Просто прочитав книгу теории категорий и решил применить ее к haskell.

Автор определяет Monoid как:

Моноид - это набор L, снабженный двоичной операцией *: LxL- > L и отмеченным единичным элементом u в L, для которого и т.д.

Взяв структуру "Список" как моноид, ясно, что двоичная операция concat, а единица - [].

Но какое здесь множество М? Я пробовал L = {set of all lists}, но я думаю, что это приводит меня к неприятностям с "L в L?" вопрос, который, похоже, та же проблема, что и множества.

Или я что-то неправильно думаю?

EDIT: Как указано в @applicative, списки Haskell являются моноидами, называемыми Free monoids!

4b9b3361

Ответ 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"