我认为所有类型的类都有规律,通过指定方程来建立对称性。我想知道是否有任何突出的理论或甚至实际的类型类建立不对称的例子,即那些要求缺乏对称性的例子?通过例如指定<expr1> /= <expr2>
或<
或not somePredicate(a, b)
。
我理解不平等可以表示为与自由变量相等,即a > b
= a + k = b
等等,但我认为引入自由变量本身可能与我的想法一致强制不对称。
这种法律的(理论)应用是什么?还有(可运行的)这个例子吗?
答案 0 :(得分:1)
一般来说,代数法通常只根据等同身份来定义,而不仅仅是不平等。考虑这个问题的观点是模型理论。 理论可以被认为是1)不同元素的符号集合,因此句子可以从它们构建(即,arity 0我们可能有数字序列,我们有arity 1否定,我们有另外两个方面,和2)一组方程,提供从这些签名构建的句子之间的关系。
这让我们可以描述各种算术理论,组,环,模块等等。
现在理论的模型是一组具体的数学对象(数字,函数等)到签名元素的赋值,这样句子就可以转换成元素。模型尊重这些方程式。
分类地,我们经常将理论视为签名生成的所有可能句子的一种特殊类别。此类别中的箭头是含义 - 可以通过应用等同身份从其他人生成的句子。这反过来导致所有句子之间的等价性在等同身份的应用下是相同的(这产生了&#34;生成者和关系&#34;方法)。反过来,模型只是从这个理论到任何其他类别的仿函数,尽管通常是Set
。
这在语法和语义之间产生了非常好的结合。您想要建模的句子集合越多,您可以获得的模型越少,您拥有的模型越多,所有这些句子的满意度就越小。 (这里我只是概述了这个想法,而不是填写许多重要细节)。
在任何情况下,人们倾向于忽视这一点,但真正得到回报的一个结果是,在这种情况下,你想要一个终端模型&#34;这是所有模型中最少的,就像你想要一个&#34;初始理论&#34;承认所有模特。终端(也称为平凡)模型是将理论中的所有内容发送到空集并映射到空集上的仿函数。当你有这样的东西时,会出现很多很好的属性。但请注意 - 要拥有这样的东西,你必须只有等同身份,而不是&#34; disidentities。&#34;这些理论被称为Algebraic Theories.
这与Haskell有什么关系?那么,我们可以将类型类的签名正确地理解为代数理论的签名,并将它们的定律看作这些理论的方程。这通常是Haskell中如何使用类型类以及它们被引入的原因 - 以适应这些情况。
但我们当然不会 这样做 - 我们可以拥有我们想要的任何法律。但是我们在此过程中失去了各种各样不错的特性 - 事实上,实际上发现不平等意味着我们的理论只有很少的模型,而且它们的结构很奇怪。由于类型类用于捕获各种事物之间的共同结构,并且由于非代数理论倾向于修复唯一(ish)模型,因此事实证明我们很少想要使用不等式类型法中的关系。事实上,我无法想到任何我已经看到它的例子。
这是另一种思考方式 - 考虑一个具有平等和不平等的理论,然后消除不平等。剩下的仍然是所有以前的模型,但也可能有一堆&#34;无意识的&#34;那些。因此,我们不会在重写方面获得额外的推理 - 我们只是将某些先验排除的模型排除在外。此外,当一个人希望排除&#34;无意识的&#34;模型这通常是因为我们想要修复一个特定的&#34;意图&#34;一。如果我们想要修复一个特定的预期模型,问题就会立即出现 - 为什么不使用那个具体的结构,而不是更一般的类型类?