【问题标题】:Sml type confusionSml 类型混淆
【发布时间】:2013-12-31 09:50:48
【问题描述】:

我有这个功能:

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

返回类型为

fn: 'a * 'a * 'a list list -> 'a list list

谁能向我解释一下这个类型是如何从函数中生成的?谢谢!

编辑:另外,我该如何调用这个函数?

【问题讨论】:

  • 在有人回答后,您不应该用完全不同的问题替换您的问题。
  • 我已将其退回到原来的问题。如果您想问一个新问题,请这样做,而不是编辑这个问题。
  • @OP:这就是所谓的类型推断。您可能刚刚要求人们向您解释什么是类型推断。

标签: sml smlnj


【解决方案1】:

:: 有两个参数——一个在左边,一个在右边。如果它的左参数是t 类型,那么它的右参数必须是t list 类型。

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

因此,当您拥有代码 (u::[v]) 时,您是在告诉 SML u : t'v : t 用于某些类型 t。那么这个表达式就是一个t list,因此要将它用作:: 的左参数,右参数w 必须具有t list list 类型。

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

总结一下:
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]] 列表。

【讨论】:

  • 当我使用您的示例调用它时,出现域错误。表示操作数:int * int * int* list
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 2019-03-15
相关资源
最近更新 更多