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:这就是所谓的类型推断。你可能只是要求人们解释一下推理是什么类型的。