6

我在某处读到高阶多态性不能在具有值类型的类型系统(如.NET)中使用/实现。对吗?为什么?

4

2 回答 2

7

问题在于价值表示。

传统的高阶多态性语言做出了简化的选择,即所有值都以统一的方式表示,通常是一个单词,并带有一些巧妙的标记来指示它是立即整数还是指向具有通用表示的结构的指针(一些标记等)用于所有其他值,例如数据结构或函数。

如果你有这个假设,你可以编译每个多态函数一次,并在所有类型的所有参数上使用它:它们具有编译函数假定的表示。

现在说你抛出具有其他表示的类型,例如。堆栈上的几个连续单词。你不能再使用你的单个编译函数,因为它需要一个单词,所以调用约定是不正确的。东西坏了。

这可以通过多种方式解决,例如:

  • 与值一起传递有关其表示的一些信息(您可以将此信息视为一种运行时“类型”信息,但实际上您不需要完整的类型信息,只需要有关表示的一些信息);例如,这就是TILT编译器探索的内容

  • 尝试为每种可能的表示编译多态函数的几个专门版本,然后决定(也基于各种标记或一些静态可用信息)要调用哪个版本。这对于诸如 MLton 的整个程序优化方案是合理的。这或多或少是第一个想法的调用者选择(而不是被调用者选择)版本。

  • 使用一种类型系统来限制多态性以区分“单字类型”、“元组类型”。代替通常的“所有类型”的多态性,您将有一个“用于所有此类类型......”的相对化版本。这允许程序员静态地推断哪个函数可以接受哪种类型的参数(“哦,这个函数是多态的,所以我必须在这里装箱我的值类型”)而不是希望编译器能够正确地得到强制,但这也是使类型系统更重:您不会保留统一的错觉。

简而言之,结合(某种形式的)多态性与丰富的数据表示选择是可能的,但比统一表示的情况要困难得多。

于 2011-04-05T21:12:26.147 回答
0

不,这是不正确的。您可以通过将参数类型定义为泛型或类型来实现“高阶多态性”(在所有类型上行为一致的函数)object(值类型将自动“装箱”到对象中)

于 2011-04-05T19:53:03.367 回答