Haskell中类型检查的Paterson条件

Haskell中类型检查的Paterson条件,haskell,type-inference,type-resolution,Haskell,Type Inference,Type Resolution,有人能解释一下(或给我一些例子或过程)为什么在Haskell中终止实例解析过程需要这些条件吗?或者至少是描述该算法的链接 例如,我试图找到一些关于它的讲座,但我只能找到关于类型推断的内容,而不能找到这个实例解析过程 我引述 规则如下: Paterson条件:对于上下文中的每个类约束(cT1…tn) 类型变量在约束中的引用次数不超过头部中的引用次数 约束的构造函数和变量(加在一起并计算重复次数)比头少 约束没有提到类型函数。类型函数应用程序原则上可以扩展为任意大小的类型,并且 因此,他们被立即拒绝

有人能解释一下(或给我一些例子或过程)为什么在Haskell中终止实例解析过程需要这些条件吗?或者至少是描述该算法的链接

例如,我试图找到一些关于它的讲座,但我只能找到关于类型推断的内容,而不能找到这个实例解析过程

我引述

规则如下:

  • Paterson条件:对于上下文中的每个类约束
    (cT1…tn)
  • 类型变量在约束中的引用次数不超过头部中的引用次数
  • 约束的构造函数和变量(加在一起并计算重复次数)比头少
  • 约束没有提到类型函数。类型函数应用程序原则上可以扩展为任意大小的类型,并且 因此,他们被立即拒绝
  • 覆盖条件。对于每个函数依赖项,
    ⟨电视⟩左->⟨电视⟩右侧,在类中,
    S中的每个类型变量(⟨电视⟩右)
    必须出现在
    S中(⟨电视⟩左)
    ,其中
    S
    是替换映射 类声明中的每个类型变量都对应于相应的类型 在实例头部

  • 我认为这些条件不是必要的,而是充分的,即它们意味着终止。您可以编写一组违反Paterson条件的实例,但它们会导致终止。此外,考虑迁移到StasOpFoad以获得更多的可见性:Haskell社区(包括我自己)经常处理这样的问题。甚至还有一个建议,用更好的条件来替换它们。“关于它的讲座”是从用户指南中链接到的:“理解…通过“约束处理规则”。没有更简单的详细解释了。你引用的措辞很清楚,不是吗?您可以使用
    不可判定实例
    关闭条件。然后,正如@chi所说,类型推断可能会终止。(GHC使用一个简单的堆栈深度限制来避免无限循环。)有条件确保上下文中的每个约束(以及约束的上下文等)使问题变得更小。@Li yau Xia,是的,非常好。评论中有很多例子和讨论。o、 p.“我只能找到关于类型推理的东西”:实例解析是类型推理;类型推理需要实例解析;因为解析到一个实例之后,就可以使用函数依赖关系改进类型。