Коммутативный моноид из пакета 'алгебра' на 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