我的功能旨在将列表中的第一项放在列表的末尾。
该列表可以是任何类型。
我试图预期会有一个空列表输入,但是在类型方面却出现了错误。

如何使此代码按预期工作?

fun cycle1 aList = if null(aList) then []else tl(aList) @ [hd aList];
cycle1 [];

stdIn:24.1-24.10 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)

最佳答案

这不是错误,只是警告。

- fun cycle1 aList = if null(aList) then []else tl(aList) @ [hd aList];
val cycle1 = fn : 'a list -> 'a list
- cycle1 [];
stdIn:2.1-2.10 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)
val it = [] : ?.X1 list

请注意,实际上有一个结果[],它是“虚拟类型” ?.X1 list的列表。

发生这种情况是因为值不能是多态的(您不能创建'a list)。
搜索值限制以获取详细信息。

您可以通过使用特定类型的空列表来避免该警告:
- cycle1 ([] :int list);
val it = [] : int list
- cycle1 ([] : string list);
val it = [] : string list

另外,我建议您尽快熟悉模式匹配,因为它会使代码更易读。
fun cycle1 [] = []
  | cycle1 (x::xs) = xs @ [x]

10-06 11:37