我的功能旨在将列表中的第一项放在列表的末尾。
该列表可以是任何类型。
我试图预期会有一个空列表输入,但是在类型方面却出现了错误。
如何使此代码按预期工作?
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]