首先,让我们来看看自由幺半群的定义。我从来没有完全理解“如何将自由幺半群定义为遵守幺半群法则而无其他规则的结构”。我们如何证明某个东西只遵循上述法则而不遵循其他规则呢?还是这只是一种直觉?
让我解释一下自由幺半群的目的。
如果我告诉你有一个幺半群,其中一些元素是a、b、c,那么你能从中推断出什么?
1.我们可以通过使用“生成器”a、b、c和幺半群操作(+)和0(也就是(<>)和mempty)编写表达式来找到该幺半群的更多元素。 (请参见此答案的后半部分中的定义1。)
2. 我们可以使用幺半群定律来证明一些表达式表示相同的元素:我们可以证明像((a+0)+b)=(a+b)这样的方程式。(定义2。)实际上,我们只需具备这些基础知识所能证明的方程式是对于任何值a、b、c,在任何幺半群中都是成立的。(定理1。)
那么不能仅凭幺半群定律证明的等式怎么办呢?例如,我们无法证明(a+b)=(b+a)。但是如果我们只知道幺半群定律,那么我们也不能证明它的否定(a+b)!=(b+a)。这是什么意思?事实证明,在某些幺半群(例如可交换幺半群)中,该等式成立,而在其他幺半群中则不成立:例如,选择一个幺半群,其中对于几乎所有的x和y均满足x+y=y(这是Haskell中的“Last”幺半群),如果我们选择不同的a和b,则(a+b)!=(b+a)。
但这只是一个例子。那么对于我们无法仅通过幺半群定律证明的等式,我们可以从中得出什么结论呢?自由幺半群提供了一个明确的答案,事实上是一个通用的反例:无法证明的等式在自由幺半群(由a、b、c产生)中是错误的。换句话说,我们可以仅通过幺半群定律证明方程式e=f当且仅当它在自由幺半群中为真(强调“当”)。 (定理2。)这对应于自由幺半群“只遵循幺半群定律而不遵循其他规则”的直觉。
所以,这个函子是否使得 Last 成为一个自由幺半群呢?更一般地说,如果 Monoid (T a) 有一个遵守法则的实例,那么 T a 是否是自由幺半群呢?
Last
幺半群不是自由幺半群,因为它使得比单纯从幺半群法则可以证明的等式更多的等式成立。参见
其他回答:
forall (t :: Type) (x, y :: t).
Last (Just x) <> Last (Just y) === Last (Just y)
下面是如何将上述内容形式化的草图。
定义1. 由(一些原子符号)A
、B
、C
生成的单子表达式集合由以下语法规则定义:
e ::=
| A | B | C
| e + e
| 0
给定任何“合适的单子”(即带有一些选择元素a,b,c的单子(M,+,0)的单子M,它们不必是不同的),表达式e表示元素eval e在M中。
定义2。方程式是一对表达式,写作e〜f。可证明方程式集是满足以下条件的方程式集(按包含关系排序时最小):
- 它包括单子律:可证明e + 0 ~ e,0 + e ~ e和((e + f) + g) 〜 (e + (f + g))。
- 它是等价关系(将元组视为关系):例如,对于自反性,e 〜 e是可证明的。
- 它是一个同余关系:如果可证明e 〜 f,则可证明(g + e) 〜 (g + f)和(e + g) 〜 (f + g)。
(该定义的想法是,如果且仅当可以通过“应用”这些规则来推断它时,断言“e 〜 f可证明”成立。 “最小集合”是形式化该定义的常规方法)
“可证明方程式”的定义可能看起来是随意的。这些是定义“可证性”的正确规则吗?为什么特别是这三个规则?值得注意的是,同余规则在首次尝试给出这样的定义时可能不明显。这就是以下定理,声音和完整性的重点。添加(非冗余)规则,我们会失去声音。删除规则,则会失去完整性。
定理1。(声音)如果可证明e 〜 f,则在任何“合适的单子”M中,eval e = eval f。
定理2。(完整性)如果无法证明e 〜 f,则它们在F中的表示方式不同,eval e≠eval f,在那里F是由A,B,C生成的自由单子。
(相对于完整性,声音要容易得多。读者的练习。)
这个完备性定理是自由幺半群的一个特征:任何其他使定理成立的幺半群
F
都同构于自由幺半群(严格来说,这需要完备性和假设表达式的指称函数
eval : Expr -> M
是满射)。这就是为什么我们可以说“自由幺半群”而不是“列表幺半群”的原因;在表示不重要的上下文中,这种做法最准确(“同构”)。
事实上,如果你将“自由幺半群”定义为幺性表达式通过等价关系 "
_ ~ _
可证明" 的商,那么完备性显然。真正难的工作在于另一个证明,即该幺半群同构于列表幺半群。
arr(f >>> g) = arr f >>> arr g
法则。我不确定唯一答案中的那个是否是自由箭头;一旦我确定在那里没有反例支持我的说法,我就变得懒惰了。=P - Daniel Wagner