表示自由岩浆(二叉叶树)、自由半群(非空列表)和自由幺半群(列表)很容易,并且不难证明它们实际上就是它们声称的那样。但自由团体似乎要棘手得多。似乎至少有两种使用通常List (Either a)
表示的方法:
- 编码类型的要求,如果你有
Left a :: Right b :: ...
那么Not (a = b)
和反之亦然。构建这些似乎有点困难。 - 处理允许任意插入/删除对(反之亦然)的等价关系
Left a :: Right a :: ...
。表达这种关系似乎非常复杂。
还有人有更好的主意吗?
编辑
我刚刚意识到唯一答案使用的选项(1)在最一般的设置中根本无法工作。特别是,如果不施加可判定的相等性,就不可能定义组操作!
编辑 2
我应该首先想到谷歌。看起来 Joachim Breitner几年前在 Agda 做过,从他的介绍性描述来看,他似乎从选项 1 开始,但最终选择了选项 2。我想我会自己尝试,如果我太卡住了我看看他的代码。