高阶多态+值类型

con*_*low 6 generics types value-type higher-kinded-types higher-order-functions

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

gas*_*che 7

问题在于价值表示.

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

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

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

这可以通过各种方式修复,例如:

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

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

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

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