如果“List”是一个幺半群,它的“集合”是什么?

时间:2012-10-17 04:31:41

标签: haskell

阅读category theory book,并决定将其应用于haskell。

作者将Monoid定义为:

  

Monoid是一个L组,配有二进制运算*:LxL-> L和L中的区分单位元素u等...

将“List”结构作为monoid,很明显二进制运算为concat,单位为[]

但是这里的M是什么? 我试过了L = {set of all lists},但我认为这会导致我遇到“L在L中?”的问题。问题,这似乎与集合有同样的问题。

或者我在想错误的东西?

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

2 个答案:

答案 0 :(得分:29)

不是说“List is a Monoid”,而是更准确地说“对于所有类型a,类型[a]是Monoid”。因此,对于任何特定类型a,您的L将为L = {set of all lists of as}。根据这个定义,L当然不能包含它自己。

答案 1 :(得分: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
实际上,这被称为“免费幺半群”