当传入空列表时,为什么我的排列函数会给我一个警告?

时间:2011-11-03 05:29:19

标签: recursion sml smlnj

我的排列功能:


    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

所以看起来我至少已经实现了广义变量。

1 个答案:

答案 0 :(得分:1)

空列表是一个特殊列表,可能具有其元素的任何类型。当您调用perms []时,编译器会对元素的类型感到困惑。您可以使用:

> val ps: int list list = perms [];

> val ps = perms ([]: int list);

然后编译器很高兴因为可以推断出特定类型的列表。