SML中作为返回值和值限制的多态函数

SML中作为返回值和值限制的多态函数,sml,smlnj,Sml,Smlnj,基本上,我想要一个函数来返回一个多态函数,比如: fun foo()=fn x=>x 因此,foo函数接受unit类型的值并返回一个多态标识函数 编译器对此很满意,它给了我: val foo=fn:unit->'a->'a 但一旦我真正调用foo函数,返回值就不是我所期望的 val it=fn:?.X1->?.X2 因为它说的值限制而不能概括,有什么帮助吗?提前感谢出于技术原因,不允许对函数调用的结果进行泛化(即,使其具有多态性)。调用的结果必须具有单态类型。如果不是这样,您可以通过以下肮脏的伎

基本上,我想要一个函数来返回一个多态函数,比如:

fun foo()=fn x=>x

因此,foo函数接受unit类型的值并返回一个多态标识函数 编译器对此很满意,它给了我:

val foo=fn:unit->'a->'a

但一旦我真正调用foo函数,返回值就不是我所期望的

val it=fn:?.X1->?.X2


因为它说的值限制而不能概括,有什么帮助吗?提前感谢

出于技术原因,不允许对函数调用的结果进行泛化(即,使其具有多态性)。调用的结果必须具有单态类型。如果不是这样,您可以通过以下肮脏的伎俩破坏类型系统:

  • 调用
    ref[]
    并获取所有“a”的类型列表列表参考
  • 插入一个字符串
  • 删除函数
  • 现在就是这样:您正在以代码的形式执行任意字符串的内容。不太好

    通过坚持
    ref[]
    返回的值为单态,可以确保它可以用作字符串列表或函数列表,但不能同时用作字符串列表或函数列表。所以这是我们为类型安全付出的部分代价