【问题标题】:The Paterson Conditions for Type Checking in HaskellHaskell 中类型检查的帕特森条件
【发布时间】:2019-02-21 09:17:23
【问题描述】:

有人可以解释(或给我一些例子或过程)为什么这些条件对于终止 Haskell 中的实例解析过程是必要的?或者至少是描述该算法的链接。

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

我引用Haskell User Guide

规则如下:

  1. 帕特森条件:对于上下文中的每个类约束(C t1 ... tn)
    1. 没有类型变量在约束中的出现次数比在头部中的次数多
    2. 约束的构造函数和变量(合起来计算重复次数)比头部少
    3. 约束没有提到类型函数。类型函数应用程序原则上可以扩展为任意大小的类型,并且 所以被拒之门外
  2. 覆盖条件。对于类的每个函数依赖,⟨tvs⟩left -> ⟨tvs⟩ 右,S(⟨tvs⟩right) 中的每个类型变量都必须出现在 S(⟨tvs⟩left) 中,其中S 是替换映射 类声明中的每个类型变量对应的类型 在实例头中。

【问题讨论】:

  • 我认为这些条件不是必要,而是足够,即它们意味着终止。您可以编写一组违反 Paterson 条件的实例,但它们会导致终止。此外,考虑迁移到 StackOverflow 以获得更多可见性:那里的 Haskell 社区(包括我自己)经常处理此类问题。
  • 确实有人提议用更好的条件替换它们github.com/ghc-proposals/ghc-proposals/pull/114
  • “关于它的讲座”是从用户指南链接的论文:“通过约束处理规则理解 ...”。没有更简单的详细解释。你引用的措辞很清楚,不是吗?您可以使用UndecidableInstances 关闭条件。然后正如@chi 所说,类型推断可能会终止。 (GHC 使用简单的堆栈深度限制来避免无限循环。)有条件确保上下文中的每个约束(以及约束的上下文等)使问题更小。
  • @Li-yau Xia,是的,非常棒。 cmets中有很多例子和讨论。操作“我只能找到关于类型推断的东西”:实例解析就是类型推断;类型推断需要实例解析;因为解析到实例然后使用功能依赖项提供改进的类型。

标签: haskell type-inference type-resolution


【解决方案1】:

用于保证实例解析在FlexibleInstances 扩展名下终止的所谓“帕特森条件”在Understanding Functional Dependencies via Constraint Handling Rules 论文的第 5 章中有完整记录。不幸的是,讨论非常技术性和密集性。

我们可以用一些更温和的解释来直观地说明哪些情况是合法的;一段时间以来,我一直在努力解决它,但没有成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2017-12-04
    • 2023-02-09
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多