我想知道如何推断矫顽力。(隐式转换)在类型推断期间。我使用的是Bastiaan在顶级质量类型错误消息中描述的类型推断方案,但我假设在所有的辛德雷-米尔纳式方法中,总的想法可能是相同的。
强制似乎可以被视为一种重载形式,但本文中描述的重载方法并没有考虑(至少在我可以遵循的方式上)基于上下文对返回类型的要求来考虑重载,这是强制强制的必要条件。我还担心,这样一种方法可能使身份强制难以优先,也难以尊重矫顽力的传递性闭包。我可以看到每一个胁迫性的表达,比如说e,用来胁迫(E),但是用它来胁迫(.(E))对于某些深度等于矫顽力的最大嵌套似乎是愚蠢的,还将矫顽力关系限制在具有有限传递闭包的事物,其深度与上下文无关,这似乎是(不必要的?)限制性的。
发布于 2010-01-12 10:16:11
我的经验是,从直觉上说,每个学期含糖量似乎都没有吸引力,但值得去追求。
由于对持久存储的兴趣,我采用了一种迂回的方法来考虑表达式和原子值的混合问题。为了支持这一点,我决定在类型系统中将它们完全分离;因此,Int、Char等是仅用于整数和字符值的类型构造函数。表达式类型是由多态类型构造函数Exp形成的;例如Exp指的是一个值,该值在一步内减少到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因此,胁迫要么是身份,要么是强制转换的应用程序,其中b是给定上下文的返回类型。
现在可以将类型类方法视为类型类方法。
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的其他实例来扩展转换的范围,尽管我还没有研究过这一点。正如您所说,重叠实例似乎是必要的。
https://stackoverflow.com/questions/69711
复制相似问题