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]
现在:
- 从函数的结构来看,
weird : A -> B -> C
对于某些类型 A、B、C。
- 结果是一个列表,所以
C
对于某些类型 D 必须是 D list
。
- 您正在
z
上调用 tl
,因此对于某些类型 E,B
必须是 E list
。
- 该调用的结果与
E list
相同,因此 D
必须与 E list
相同。
x
被用作同一个列表的元素,所以A
也必须是E list
。
- 没有进一步的限制,所以我们可以为
E
选择一个任意的 'a
。
把所有这些放在一起,你得到
weird : 'a list -> 'a list -> 'a list list
我在 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]
现在:
- 从函数的结构来看,
weird : A -> B -> C
对于某些类型 A、B、C。 - 结果是一个列表,所以
C
对于某些类型 D 必须是D list
。 - 您正在
z
上调用tl
,因此对于某些类型 E,B
必须是E list
。 - 该调用的结果与
E list
相同,因此D
必须与E list
相同。 x
被用作同一个列表的元素,所以A
也必须是E list
。- 没有进一步的限制,所以我们可以为
E
选择一个任意的'a
。
把所有这些放在一起,你得到
weird : 'a list -> 'a list -> 'a list list