- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到 Rust 使用 Hindley-Milner 有很好的类型推断。 Rust 也有可变变量,据我所知,当 HM 算法处理可变性时必须有一些约束,因为它可能过度泛化。以下代码:
let mut a;
a = 3;
a = 2.5;
不编译,因为在第二行推断出整数并且不能将浮点值分配给整数变量。所以我猜测对于简单变量,一旦推断出非泛型类型,变量就会变成单一类型,不能再泛化。
但是像 Vec 这样的模板呢?例如这段代码:
let mut v;
v = Vec::new();
v.push(3);
v.push(2.3);
这又失败了,但是最后一行又失败了。这意味着第二行部分推断出类型 (Vec),第三行推断出容器类型。
规则是什么?是否有我不知道的值限制之类的东西?还是我让事情过于复杂,而 Rust 有更严格的规则(比如根本没有泛化)?
最佳答案
rustc 在其类型推断中过于急切被认为是一个问题(就诊断质量而言)。
如果我们检查您的第一个示例:
let mut a = 3;
a = 2.5;
然后第一行导致推断a
有一个 {generic integer type}
,第二行将导致诊断 2.5
不能分配给 a
因为它不是通用整数类型。
预计更好的算法会记录冲突,然后指向每种类型的来源。也许我们会用 Chalk 得到它.
注意:通用整数类型是 Rust 使整数文字“多态”的技巧,如果没有其他提示它应该是什么特定整数类型,它将默认为 i32
.
第二个例子的发生方式基本相同。
let mut v = Vec::new();
v.push(3);
详细信息:
v
分配类型 $T
Vec::new()
生产类型 Vec<$U>
3
生产类型 {integer}
因此,在第一行,我们得到 $T == Vec<$U>
在第二行我们得到 $U == {integer}
, 所以 v
推导出类型为 Vec<{integer}>
.
如果没有其他来源可以了解确切的整数类型,则返回到 i32
默认情况下。
我想指出,可变性实际上并不影响这里的推理;从类型推断或类型统一的角度来看,以下代码示例是等效的:
// With mutability:
let mut a = 1;
a = 2.5;
// Without mutability:
let a = if <condition> { 1 } else { 2.5 };
Rust 在 HM 方面存在更严重的问题,Deref
子类型变得更具挑战性。
关于rust - Rust 如何为 Hindley-Milner 解决可变性问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886963/
我发誓曾经有一件T恤出售,上面写着不朽的文字: 哪一部分 你不明白吗? 就我而言,答案是......全部! 特别是,我经常在 Haskell 论文中看到这样的符号,但我不知道它的含义。我不知道它应该是
考虑以下程序(在 Haskell 中,但可以是任何 HM 推断的语言): x = [] y = x!!0 使用 HM(或通过运行编译器),我们推断: x :: forall t. [t] y :: f
在 Haskell 中,我们可以编写以下数据类型: data Fix f = Fix { unFix :: f (Fix f) } 类型变量f有种* -> * (即它是一个未知类型的构造函数)。因此,
let a = b in c可以被认为是 (\a -> c) b 的语法糖。 ,但在一般的打字设置中,情况并非如此。例如,在米尔纳微积分 let a = \x -> x in (a True, a 1
我正在制作一种强类型玩具函数式编程语言。它使用 Hindley Milner 算法作为类型推断算法。 实现算法时,我有一个问题是如何推断相互递归函数的类型。 let rec f n = if n ==
我正在阅读关于 Hindley–Milner Type Inference 的维基百科文章试图从中找出一些道理。到目前为止,这是我所理解的: 类型分为单型或多型。 Monotype 进一步分类为类型常
我试图推断以下表达式的类型: let rec fix f = f (fix f) 应指定类型(a -> a) -> a 使用自下而上算法(在概括hindley-milner类型推理算法中描述)并添加以
我正在寻找关于著名 Damas-Hindley-Milner algorithm 的信息为函数式语言进行类型推断,尤其是关于实现的信息。 我已经知道如何执行 Algorithm W ,但我听说最近的新
当存在重载函数时,Hindley-Milner 算法如何工作? 以简单的形式(没有重载),它看起来很干净: y = arr[x1] //it's Generic. x1: int, arr: T[],
我正在尝试通过用我常用的语言 Clojure 实现算法 W 来自学 Hindley-Milner 类型推理。我遇到了 let 推理的问题,我不确定我是否做错了什么,或者我期望的结果是否需要算法之外的东
如果我正确理解 Haskell 中的 ST monad,runST 以巧妙的方式使用 2 级类型,以确保计算在转义 monad 时不会引用任何其他线程。 我有一种带有 Hindley-Milner 类
我正在尝试通过用我常用的语言 Clojure 实现算法 W 来自学 Hindley-Milner 类型推理。我遇到了 let 推理的问题,我不确定我是否做错了什么,或者我期望的结果是否需要算法之外的东
我读到 Rust 使用 Hindley-Milner 有很好的类型推断。 Rust 也有可变变量,据我所知,当 HM 算法处理可变性时必须有一些约束,因为它可能过度泛化。以下代码: let mut a
我正在开发一个用 Java 编写的基于数据流的简单系统(想象它就像一个 LabView 编辑器/运行时)。用户可以在编辑器中将 block 连接在一起,我需要类型推断来确保数据流图是正确的,然而,大多
我无法理解维基百科上给出的 HM 系统的 letrec 定义,这里:https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system#R
下'What is Hindley Milner'它指出: Hindley-Milner is a restriction of System F, which allows more types b
PyPy 是否在编译时进行静态类型检查以在编译时捕获类型错误?如果不是,像 HM 类型推断这样的东西是否有助于在编译时捕获这些错误? 最佳答案 否 在两个帐户上。 (我假设 PyPy 是指具有 JIT
我最近一直在学习 λ 演算。我理解无类型和有类型 λ 演算之间的区别。但是,我不太清楚 之间的区别。 Hindley-Milner 型系统 和 类型化 λ 演算 .是关于parametric poly
Hindley-Milner 是一个类型系统,它是许多众所周知的函数式编程语言的类型系统的基础。 Damas-Milner 是一种在 Hindley-Milner 类型系统中推断(推导出?)类型的算法
有人曾经在 SML 中向我展示了一个小技巧,他们在他们的 REPL 中写出了大约 3 或 4 个函数,最后一个值的结果类型非常长(就像许多页面滚动很长)。 有谁知道什么代码会生成这么长的类型,或者是否
我是一名优秀的程序员,十分优秀!