- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
AFAIK,在 Hindley-Milner 类型系统中使用的统一可以通过在构造函数位置允许类型变量并在这种情况下放宽 arity 约束来推广以统一更高级的类型:
f a ~ T a1 b1
f ~ T a1 -- generatifity + partial application
a ~ b1 -- injectivity
我想种类也涉及到,但我不知道如何。
最佳答案
这不是我真正的驾驶室,但我也许可以提供一个非常笼统的答案。
根本区别在于广义 HM 将统一视为旨在产生唯一匹配的纯句法匹配过程,而 HOU 算法涉及类型/种类的语义考虑(如类型化 lambda 演算中的术语/类型)和系统搜索通过可能统一的树,包括考虑内部节点的替代统一。
(HM 方法的局限性在于,对于一阶类型,纯句法匹配基本上相当于对类型的语义考虑和通过可能的统一进行系统搜索。)
无论如何,采取一个微不足道的高阶统一:
Either String Int ~ f String
由于
Either
的 absurd 原因,您提出的广义 HM 算法在这种统一上失败了。的参数顺序错误,纯粹是句法细节,与类型的语义统一性无关。您可以进一步概括您的算法以在句法上处理这种特殊情况,但总会有一些其他微不足道的统一与句法模式不匹配。您最终还会在统一时遇到奇怪的“不连续性”:
Either String String ~ f String
您将能够让您的算法对具有统一性的程序进行类型检查:
Either Int String ~ f Int
Either String String ~ f String
==> f x = Either x String
或者:
Either String Int ~ f Int
Either String String ~ f String
==> f x = Either String x
但大概不是两者兼而有之。
f x A ~ B
任何广义的 HM 都会立即放弃,因为类型
B
, 善良
*
, 不能与涉及
f :: * -> * -> *
的类型表达式在语法上统一.
f
在它的分支上:
f :: * -> * -> *
f u v = u
f u v = v
f u v = B
给树:
f x A ~ B
|
--------------------------------------------
| (f u v = u) | (f u v = v) | (f u v = B)
| | |
x ~ B Failure Success
|
| (x = B)
|
Success
如果您仔细考虑一下,您会发现广义 HM 类型检查器与 HOU 检查器的威力甚至无法相提并论。您还将看到,实践中的 HOU 类型检查器可能是程序员可能难以控制的一种能力。关于可以推断出
f x = Either x String
的类型检查器可能有点难以推理。或
f x = Either String x
.
关于haskell - 广义 HM 与高阶统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65993587/
这是我感兴趣的测试: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35h3.htm 如何将这段代码改编成接受数值向量并返回指定要删除
我使用 TensorFlow 1.12 基于 Material 进行语义(图像)分割。使用多项式交叉熵损失函数,这会产生不错的结果,尤其是考虑到我使用的训练数据量稀疏,mIoU 为 0.44: 然而,
AFAIK,在 Hindley-Milner 类型系统中使用的统一可以通过在构造函数位置允许类型变量并在这种情况下放宽 arity 约束来推广以统一更高级的类型: f a ~ T a1 b1 f ~
在阅读 article 时在 Javascript 中实现通用 curry 时,我偶然发现了这段代码。 function curry(fn) { return (...xs) => { i
我想使用 C++14 中引入的广义 lambda 捕获(有关解释,请参阅 Move capture in lambda)。但是,我的代码的其余部分是 C++11 友好的。我想按照以下方式做一些事情 #
我正在尝试实现 this paper 中介绍的广义 Hough 变换在 MATLAB 中。我也试过使用 this document理解算法。我一直在研究如何计算梯度角以找到要在 R 表中使用的 Φ。
假设我们有这样一段代码: std::vector> tasks; 然后我们添加这样的任务: tasks.push_back([]() { // ... } 这行得通。但现在我们要添加该任务:
问题:为什么会打印出以下内容: ChildB___Parent of ChildB ChildB___Parent of ChildB 而不是我认为它应该打印出来的: ChildA___Parent
W3C 推荐 RDF 1.1 概念和抽象语法 defines多么广义 RDF 三元组 是(即,一个非标准三元组,其中每个主语/谓语/宾语都可以是 IRI/bnode/文字)。 关于它的可能用途,它给出
我是一名优秀的程序员,十分优秀!