algebra/2.1.1.2/doc/html的文档显示了大量的类型类型。
如何声明有问题的结构必须配备可交换的关联操作和单元/标识元素,但没有其他任何东西(反转,分配等)?
我在考虑
reduce :: Monoid m => (a -> m) -> [a] -> m
但是Data.Monoid的实例不应该是可交换的,我希望我的函数用户看到他们需要通过查看类型来使函数可以交换。
答案 0 :(得分:8)
(Abelian m, Monoidal m)
Monoidal
似乎比您想要的要多得多,但它都基于Natural
为Semiring
。
答案 1 :(得分:1)
看起来这个包提供了一个Commutative类,所以如果我错了就纠正我,但看起来这只是指定第二个类型类的问题:
reduce :: (Monoid m, Commutative m) => (a -> m) -> [a] -> m