Sml类型混淆

Sml类型混淆,sml,smlnj,Sml,Smlnj,我有这个功能: fun x (u,v,w) = (u::[v])::w; 它获取的返回类型为 fn: 'a * 'a * 'a list list -> 'a list list 有人能给我解释一下这个类型是如何从函数中生成的吗?谢谢大家! 编辑:还有,我该如何调用这个函数?:接受两个参数——一个在左边,一个在右边。如果其左参数的类型为t,则其右参数的类型必须为t list 因此,::具有类型('a*'a list)->'a list,因为t是任意的,因此由'a表示 因此,当您拥有代码

我有这个功能:

fun x (u,v,w) = (u::[v])::w;
它获取的返回类型为

fn: 'a * 'a * 'a list list -> 'a list list
有人能给我解释一下这个类型是如何从函数中生成的吗?谢谢大家!


编辑:还有,我该如何调用这个函数?

接受两个参数——一个在左边,一个在右边。如果其左参数的类型为
t
,则其右参数的类型必须为
t list

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

因此,当您拥有代码
(u:[v])
时,您是在告诉SML对于某些类型
t
来说
u:t
'v:t
。然后,此表达式是一个
t列表
,因此要将其用作
的左参数,右参数
w
必须具有类型
t列表

然后,对于某些
t
,这就给出了
(u::[v])::w
的类型是
t list

总之:
u:t

v:t

w:t列表

(u::[v])::w:t列表

所有这些都适用于某些类型
t

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


要调用此函数,您可以执行类似于
x(1,2,[3,4])
的操作,这将给出列表
[[1,2],[3,4]]
,当我使用您的示例调用它时,我得到一个域错误。表示操作数:int*int*int*list在有人回答你的问题后,你不应该用完全不同的问题来代替你的问题。我已将此返回到原来的问题。如果你想问一个新问题,请这样做,而不是编辑这个问题。@OP:这就是所谓的类型推断。你可能只是要求人们解释一下推理是什么类型的。