19

刚刚阅读了范畴论书籍,并决定将其应用于haskell。

作者将 Monoid 定义为:

Monoid 是一个集合 L,配备了二元运算 *:LxL->L 和 L 中的一个可区分的单元元素 u,这样等等......

将“List”结构作为一个幺半群,显然二元运算是concat,单位是[]

但是这里的集合 M 是什么?我试过L = {set of all lists}了,但我认为这让我陷入了“L 在 L 中吗?”的麻烦。问题,这似乎与集合的问题相同。

还是我想错了什么?

编辑:正如@a​​pplicative 所指出的,Haskell 的列表是称为Free monoids 的幺半群!

4

2 回答 2

29

与其说“List is a Monoid”,不如说“For all types a, type [a]is a Monoid”更准确。因此,对于任何特定类型a,您的 L 将是L = {set of all lists of as}。有了这个定义,L 当然不能包含它自己。

于 2012-10-17T04:35:30.467 回答
4

对于任何类型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

事实上,这被称为“自由幺半群”

于 2012-10-17T04:47:41.470 回答