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

sxu*_*sxu 4 sml smlnj

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

有趣的 foo () = fn x => x

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

val foo = fn : 单位 -> 'a -> 'a

但是一旦我实际调用 foo 函数,返回值就不是我期望的了

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

由于它所说的价值限制而无法概括,有什么帮助吗?提前致谢

Nor*_*sey 5

由于技术原因,不允许您概括(即多态)函数调用的结果。调用的结果必须具有单态类型。如果不是这种情况,您可以通过以下肮脏的技巧来破坏类型系统:

  1. 调用ref []并返回类型列表forall 'a . 'a list ref
  2. 插入一个字符串。
  3. 删除一个函数

就这样:您现在正在将任意字符串的内容作为代码执行。不好。

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