我想知道如何推断矫顽力。(隐式转换)在类型推断期间。我使用的是Bastiaan在顶级质量类型错误消息中描述的类型推断方案,但我假设在所有的辛德雷-米尔纳式方法中,总的想法可能是相同的。
强制似乎可以被视为一种重载形式,但本文中描述的重载方法并没有考虑(至少在我可以遵循的方式上)基于上下文对返回类型的要求来考虑重载,这是强制强制的必要条件。我还担心,这样一种方法可能使身份强制难以优先,也难以尊重矫顽力的传递性闭包。我可以看到每一个胁迫性的表达,比如说e,用来胁迫(E),但是用它来胁迫(.(E))对于某些深度等于矫顽力的最大嵌套似乎是愚蠢的,还将矫顽力关系限制在具有有限传递闭包的事物,其深度与上下文无关,这似乎是(不必要的?)限制性的。
发布于 2008-09-16 06:24:33
我希望你能得到一些好的答案。
我还没看过你链接到的报纸,但听起来很有趣。您看过Haskell中的ad多态性(基本上是重载)是如何工作的吗?Haskell的类型系统是H加上其他一些好东西。其中之一就是类型类。类型类提供重载,或者按Haskeller的说法,提供即席多态.
在使用最广泛的Haskell编译器GHC中,类型类是通过在运行时传递字典来实现的。字典允许运行时系统从类型查找到实现。据推测,jhc可以在编译时使用超级优化来选择正确的实现,但我对它处理Haskell所允许的完全多态的情况表示怀疑,而且我也不知道有任何正式的证据或论文断言这种正确性。
听起来,您的类型推断将遇到与其他秩n多态方法相同的问题。您可能很想阅读这里的一些论文以获得更多的背景:向下滚动到“关于类型的论文”,他的论文是haskell的,但是类型理论应该是有意义和有用的。
我认为这篇关于秩n多态性和类型检查问题的文章应该会引起一些有趣的想法:http://research.microsoft.com/~simonpj/papers/higher-rank/。
我希望我能提供一个更好的答案!祝好运。
发布于 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的其他实例来扩展转换的范围,尽管我还没有研究过这一点。正如您所说,重叠实例似乎是必要的。
发布于 2008-09-16 06:19:49
你能再澄清一下你到底在问什么吗?
我有一个小小的想法,如果我的想法是正确的,那么这个答案就足以作为我的答案了。我相信您是从正在创建一种语言的人的角度来讨论这个问题的,在这种情况下,您可以查看像ActionScript 3这样的语言作为示例。在AS3中,您可以以两种不同的方式键入类型: 1) NewType( object ),或2)对象为NewType。
从实现的角度来看,我认为每个类都应该定义自己的转换方式,将其转换为可以转换到的任何类型(数组不能真正转换为integer...or,对吗?)例如,如果您尝试Integer( myArrayObject ),而myArrayObject没有定义一种转换为和整数的方法,您可以抛出一个异常,或者让它发生,然后简单地传入原始对象。
我的答案可能完全错了:-如果这不是你想要的,请告诉我
https://stackoverflow.com/questions/69711
复制相似问题