|
|
1
13
现在,一个 自由的 直觉上,幺半群是一个只满足上面这些方程的幺半群,显然,还有它们的所有结果。
例如,Haskell列表幺半群
相比之下,Haskell和幺半群
这不是前两个方程的结果。
注意,在数学中可以证明所有自由幺半群同构于列表幺半群
|
|
|
2
13
自由幺半群
到
标识元素为空列表,二进制操作为列表串联:
直觉上,我认为这个幺半群是“自由的”,因为它是一个你能理解的幺半群 总是 应用,不管您想使用哪种类型的值(就像免费的monad是您可以使用的monad一样) 总是 从任何函子创建)。 此外,当一个类型存在多个幺半群时,自由幺半群推迟决定使用哪个特定幺半群。例如,对于整数,存在无穷多个幺半群,但最常见的是加法和乘法。 如果您有两个(或更多的整数),并且您知道您可能想要聚合它们,但是您还没有决定要应用哪种类型的聚合,您可以使用自由幺半群来“聚合”它们-实际上,这意味着将它们放入一个列表中:
如果您以后决定将它们添加到一起,则有可能:
如果您希望将它们相乘,也可以这样做:
在这两个例子中,我特意选择将每个数字提升为一个类型(
对于加法和乘法,有更简洁的方法,但我这样做是为了说明如何使用更具体的幺半群来解释自由幺半群。 |
|
|
3
4
|
|
|
4
4
幺半群
集上的自由幺半群
换句话说,它是一个没有特殊作用的幺半群。
例如,幺半群是运算为加法且恒等式为0的整数。另一个幺半群是整数序列,其操作为串联,标识为空序列。现在加法下的整数不是整数上的自由幺半群。将映射视为整数序列
那么什么是集合上的自由幺半群呢
它会有一个
我们可以编写一个函数来显示它是如何免费的:
很明显,这满足了关于自由幺半群的必要定律
所以现在我们应该问,我们是否可以把它变成一个更简单的自由幺半群,也就是一个实际的幺半群。答案是肯定的。一种方法是观察这一点
我们可以做的第二个观察是,两者之间应该没有区别
奇怪的结构
或者我们可以写:
行动包括:
|