我的排列功能:
fun perms [] = [[]] | perms (x::xs) = let fun insertEverywhere [] = [[x]] | insertEverywhere (y::ys) = let fun consY list = y::list in (x::y::ys) :: (map consY (insertEverywhere ys)) end in List.concat (map insertEverywhere (perms xs)) end;
输入:
perms [];
输出:
stdIn:813.1-813.9 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val it = [[]] : ?.X1 list list
有人可以解释为什么类型变量不是一般化的吗?
我应该注意,输入烫发后给出了烫发的类型;如
perms;
val it = fn : 'a list -> 'a list list
所以看起来我至少已经实现了广义变量。
答案 0 :(得分:1)
空列表是一个特殊列表,可能具有其元素的任何类型。当您调用perms []
时,编译器会对元素的类型感到困惑。您可以使用:
> val ps: int list list = perms [];
或
> val ps = perms ([]: int list);
然后编译器很高兴因为可以推断出特定类型的列表。