ML 函数定义的类型配置文件

Type profiles for ML function definitions

我在 Google 上搜索过,但没有找到任何关于 ML 类型配置文件的信息。

例如:fun bar(a, b, c) = [a, b + hd(c)];

类型配置文件是:int * int * int list -> int list

fun weird x z = [x, tl(z)]类型配置文件是'a list -> 'a list -> 'a list list

但是我不明白这背后的逻辑。

"Type profile" 不是东西。您可能是指类型推断。在这种情况下很容易。首先,请注意,像您这样的柯里化函数定义等同于编写

val weird = fn x => fn z => [x, tl z]

现在:

  1. 从函数的结构来看,weird : A -> B -> C 对于某些类型 A、B、C。
  2. 结果是一个列表,所以 C 对于某些类型 D 必须是 D list
  3. 您正在 z 上调用 tl,因此对于某些类型 E,B 必须是 E list
  4. 该调用的结果与 E list 相同,因此 D 必须与 E list 相同。
  5. x被用作同一个列表的元素,所以A也必须是E list
  6. 没有进一步的限制,所以我们可以为 E 选择一个任意的 'a

把所有这些放在一起,你得到

weird : 'a list -> 'a list -> 'a list list