如何推断强制?

时间:2008-09-16 06:04:57

标签: compiler-construction programming-languages types type-inference type-theory

我想知道如何在类型推断期间推断强制(a.k.a.隐式转换)。我正在使用Bastiaan Heeren在Top Quality Type Error Messages中描述的类型推理方案,但我认为所有Hindley-Milner方法中的一般概念可能都是相同的。

似乎强制可以被视为一种重载形式,但本文中描述的重载方法不考虑(至少不是我可以遵循的方式)基于上下文对返回类型的要求进行重载这是胁迫的必要条件。我还担心这种做法可能使得难以优先考虑身份强制,并且也要尊重强制性的过渡性结束。我可以看到每个强制性的表达,比如 e ,强迫( e ),但加油(胁迫(胁迫)(胁迫(......) )...)))对于某些深度等于强制的最大嵌套似乎是愚蠢的,并且还将强制性关系限制为具有有限传递闭包的东西,其深度与上下文无关,这似乎是(不必要的?限制性的。

3 个答案:

答案 0 :(得分:3)

我希望你能得到一些好的答案。

我还没有读过您链接的论文,但听起来很有趣。您是否了解了Haskell中ad-hoc多态(基本上是重载)的工作原理? Haskell的类型系统是H-M加上其他一些好东西。其中一个好东西是类型类。类型类提供重载,或者像Haskeller所称的那样,ad-hoc多态。

在GHC中,使用最广泛的Haskell编译器,类型类是通过在运行时传递字典来实现的。字典允许运行时系统从类型到实现进行查找。据推测,jhc可以使用超级优化在编译时选择正确的实现,但我怀疑它处理Haskell允许的完全多态的情况,我知道没有正式的证据或论文断言正确性。

听起来你的类型推断会遇到与其他rank-n多态方法相同的问题。你可能想在这里阅读一些论文以获得更多背景知识:Scroll down to "Papers about types"他的论文是针对特定的,但理论类型对你来说应该是有意义和有用的。

我认为关于rank-n多态性和类型检查问题的这篇论文应该为你提出一些有趣的想法:http://research.microsoft.com/~simonpj/papers/higher-rank/

我希望我能提供更好的答案!祝你好运。

答案 1 :(得分:1)

我的经验是,每个术语的含糖直觉看起来都没有吸引力,但值得追求。

对持久存储的兴趣使我通过迂回的路线来考虑混合表达式和原子值的问题。为了支持这一点,我决定在类型系统中将它们完全分开;因此Int,Char等是仅用于整数和字符值的类型构造函数。用多态类型构造函数Exp形成表达式类型;例如Exp Int指的是一步减少到Int。

的值

当我们考虑评估时,会出现这与您的问题的相关性。在底层,存在需要原子值的基元:COND,addInt等。有些人将此称为强制表达式,我更喜欢将其视为不同类型的值之间的转换。

面临的挑战是看看是否可以在不需要明确的减少指令的情况下完成。一种解决方案正如您所建议的那样:即将强制视为一种超载形式。

假设我们有一个输入脚本:foo x

然后,在加糖后,这变为:(coerce foo) (coerce x)

非正式地:

coerce :: a -> b
coerce x = REDUCE (cast x) if a and b are incompatible
x                          otherwise

因此强制是身份或 cast 的应用程序,其中 b 是给定上下文的返回类型。

现在可以将

cast 视为类型类方法,例如

class Cast a, b where {cast :: a -> b };
-- ¬:: is an operator, literally meaning: don’t cast
--(!) is the reduction operator. Perform one stage of reduction.

-- Reduce on demand
instance Cast Exp c, c where { inline cast = ¬::(!)(\x::(Exp c) -> ¬::(!)x) };

¬::注释用于抑制强制语法糖化。

目的是可以引入Cast的其他实例来扩展转换范围,尽管我没有探讨过这一点。如你所说,重叠实例似乎是必要的。

答案 2 :(得分:0)

你能否再详细说明你究竟要问的是什么?

我有一个小小的想法,如果我的想法是对的,那么这个答案应该足以作为我的答案。我相信你是从创建语言的人的角度谈论这个问题,在这种情况下,你可以看一下像ActionScript 3这样的语言。在AS3中,您可以使用两种不同的方式:1) NewType(对象),或2)对象作为NewType

从实现的角度来看,我对每个类进行映像应该定义它自己转换为可以转换为哪种类型的方式(一个数组不能真正转换为整数......或者可以吗? )。例如,如果您尝试 Integer(myArrayObject),并且myArrayObject没有定义转换为Integer的方法,您可以抛出异常或让它成为简单地传入原始对象,uncasted

我的完整答案可能完全取消了:-D让我知道这不是你想要的