Sml型混淆

时间:2013-12-12 19:44:14

标签: sml smlnj

我有这个功能:

fun x (u,v,w) = (u::[v])::w;

获得

的返回类型
fn: 'a * 'a * 'a list list -> 'a list list

有人可以向我解释这个类型是如何从函数中生成的吗?谢谢!

编辑:另外,我如何调用此函数?

1 个答案:

答案 0 :(得分:2)

::有两个参数 - 一个在左边,一个在右边。如果其左参数的类型为t,则其右参数必须为t list类型。

因此,::的类型为('a * 'a list) -> 'a list,因为t是任意的,因此由'a表示。

当您拥有代码(u::[v])时,您告诉SML某些类型u : t 'v : tt。该表达式为t list,因此要将其用作::的左参数,正确的参数w必须具有t list list类型。

然后,对于某些(u::[v])::wt list list的类型为t

总结:
u : t
v : t
w : t list
(u::[v])::w : t list list

所有类型t

因此,x的类型为('a * 'a * 'a list) -> 'a list list,因为t是任意的。

要调用此函数,您可以执行x(1,2,[3,4])之类的操作,这会给列表[[1,2],[3,4]]