高阶多态+值类型

时间:2011-04-05 19:40:12

标签: generics types higher-order-functions value-type higher-kinded-types

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

2 个答案:

答案 0 :(得分:7)

问题在于价值表示。

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

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

现在假设您使用其他表示形式抛出类型,例如。堆栈上有几个连续的单词。你不能再使用你的单个编译函数,因为它会期望一个单词,所以调用约定是不正确的。有些东西坏了。

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

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

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

  • 使用种类系统限制多态性以区分“单词类型”,“元组类型”。而不是通常的多态性“为所有类型”,你将有一个“适用于所有类型的这种类型......”的相对化版本。这允许程序员静态地推断哪个函数可以接受哪种类型的参数(“ow,这个函数是多态的,所以我必须在这里列出我的值类型”),而不是希望编译器能够得到正确的强制,但这也是使类型系统更重:你不保持均匀的错觉。

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

答案 1 :(得分:0)

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