0

我的置换函数:

    有趣的烫发 [] = [[]]
        | 烫发 (x::xs) = 让
            有趣的 insertEverywhere [] = [[x]]
            | insertEverywhere (y::ys) = 让
                有趣的 consy 列表 = y::list
            在
                (x::y::ys) :: (map consY (insertEverywhere ys))
            结尾
        在
            List.concat (map insertEverywhere (perms xs))
        结尾;

输入:

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的类型是在输入perms后给出的;作为

perms;
val it = fn : 'a list -> 'a list list

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

4

1 回答 1

1

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

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

或者

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

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

于 2011-11-03T06:13:31.413 回答