阅读category theory book,并决定将其应用于haskell。
作者将Monoid定义为:
Monoid是一个L组,配有二进制运算*:LxL-> L和L中的区分单位元素u等...
将“List”结构作为monoid,很明显二进制运算为concat
,单位为[]
。
但是这里的M是什么?
我试过了L = {set of all lists}
,但我认为这会导致我遇到“L在L中?”的问题。问题,这似乎与集合有同样的问题。
或者我在想错误的东西?
编辑:正如@applicative所指出的,Haskell的列表是名为Free monoids的幺半群!
答案 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
实际上,这被称为“免费幺半群”