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

时间:2010-01-27 21:17:20

标签: sml smlnj

基本上,我想要一个函数来返回一个多态函数,有点像这样:

fun foo()= fn x => x

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

  1. 致电ref []并返回forall 'a . 'a list ref
  2. 类型的列表
  3. 插入字符串。
  4. 删除功能
  5. 你就是:你现在正在执行任意字符串的内容作为代码。不好。

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