代码之家  ›  专栏  ›  技术社区  ›  Doug McClean

如何推断胁迫?

  •  4
  • Doug McClean  · 技术社区  · 16 年前

    我想知道如何在类型推断期间推断强制(也称为隐式转换)。我正在使用中描述的类型推理方案 Top Quality Type Error Messages 作者巴斯蒂安·希伦,但我认为在所有辛德雷·米尔纳风格的方法中,总体思路可能是相同的。

    似乎可以将强制处理视为重载的一种形式,但是本文中描述的重载方法没有考虑(至少在某种程度上,我无法理解)基于上下文对返回类型的要求的重载,而返回类型是强制处理的必需条件。我还担心,这样的方法可能会使优先考虑身份强制,以及尊重强制的传递闭包变得困难。我可以看到对每一个强制表达加糖,比如 e 胁迫 e ,但是加糖来强制(强制(强制(…胁迫 e )…))对于某个深度等于强制的最大嵌套似乎很愚蠢,并且还将强制关系限制为具有有限传递闭包的对象,其深度独立于上下文,这似乎(不必要?)限制性的。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jason Dagit    16 年前

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

    我还没读过你链接到的报纸,但听起来很有趣。你有没有看过haskell中的ad hoc多态性(基本上是重载)是如何工作的?哈斯克尔的类型系统是H-M加上其他一些好东西。其中一个优点是类型类。类型类提供重载,或者如haskeller所说的,即席多态性。

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

    听起来您的类型推断将遇到与其他rank-n多态方法相同的问题。你很可能想在这里阅读一些论文以了解更多背景: Scroll down to "Papers about types" 他的论文是哈斯克尔的具体,但类型理论的东西应该是有意义和有用的你。

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

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

        2
  •  1
  •   mayfly    14 年前

    我的经验是,从直觉上看,给每个词加糖似乎都没有吸引力,但值得追求。

    对持久性存储的兴趣使我走了一条迂回的道路来考虑表达式和原子值混合的问题。为了支持这一点,我决定在类型系统中将它们完全分离;因此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
    

    因此 胁迫 是身份或应用程序 铸造 哪里 是给定上下文的返回类型。

    铸造 现在可以被视为类型类方法,例如。

    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 可以引入以扩展转换的范围,尽管我还没有探索过这一点。正如你所说,重叠的实例似乎是必要的。

        3
  •  0
  •   willurd    16 年前

    你能再澄清一下你到底在问什么吗?

    我有一个小小的想法,如果我的想法是对的,那么这个答案就足够作为我的答案了。我相信你是从一个正在创造一种语言的人的角度来谈论这个问题的,在这种情况下,你可以以actionscript 3这样的语言为例。在as3中,您可以用两种不同的方式进行打字:1) 新类型(对象) ,或2) 对象为新类型 .

    从实现的角度来看,我认为每个类都应该定义自己转换为任何类型的方法 可以 转换为(数组不能真正转换为整数…还是可以?)。例如,如果您尝试 整数(MyArrayObject) ,并且myArrayObject没有定义转换为和整数的方法,您可以抛出异常或让它成为异常,然后简单地传入原始对象,未经粘贴。

    不过,我的整个回答可能完全没有意义:如果这不是你要找的,请告诉我。