【问题标题】:Commutative monoid from 'algebra' package on HackageHackage 上的“代数”包中的可交换幺半群
【发布时间】:2012-09-05 21:03:29
【问题描述】:

algebra/2.1.1.2/doc/html 的文档显示了大量的类型类。

我如何声明一个有问题的结构必须配备一个交换关联运算和一个单位/单位元素,但没有其他任何东西(逆、分布等)?

我在考虑

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

但是 Data.Monoid 的实例不应该是可交换的,我希望我的函数的用户通过查看类型来了解他们需要可交换性才能使函数工作。

【问题讨论】:

    标签: haskell hackage abstract-algebra


    【解决方案1】:

    (Abelian m, Monoidal m)

    看起来Monoidal 比你想要的要多得多,但这一切都是基于NaturalSemiring

    【讨论】:

      【解决方案2】:

      看起来那个包提供了一个 Commutative 类,如果我错了,请纠正我,但它看起来只是指定第二个类型类的问题:

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

      【讨论】:

      • Commutative 谈论的是Multiplicative 类的动作,而不是Monoid。您可以使用(Commutative m, Unital m) 得到一个可与(*)one 一起使用的乘法可交换幺半群,或者使用(Abelian m, Monoidal m) 得到一个可与(+)zero 一起使用的可交换幺半群。