Коммутативный моноид из пакета 'алгебра' на Hackage

Документация по алгебре / 2.1.1.2 / doc / html показывает колоссальное количество классов типов.

Как мне объявить, что рассматриваемая структура должна быть оснащена коммутативной ассоциативной операцией и элементом единица / тождество, но без чего-либо еще (инверсии, дистрибутивность и т. Д.)?

Я думал о

reduce :: Monoid m => (a -> m) -> [a] -> m

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

2 ответа

Решение

(Abelian m, Monoidal m)

Может показаться, что Monoidal это гораздо больше, чем вы хотите, но все это основано на Natural быть Semiring,

Похоже, что этот пакет предоставляет класс Commutive, так что поправьте меня, если я ошибаюсь, но похоже, что это просто вопрос указания второго класса типов:

reduce :: (Monoid m, Commutative m) => (a -> m) -> [a] -> m
Другие вопросы по тегам