Почему моя функция перестановок выдает мне предупреждение, когда передается пустой список? - PullRequest
0 голосов
/ 03 ноября 2011

моя функция перестановки:


    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 Ответ

1 голос
/ 03 ноября 2011

Пустой список - это специальный список, который потенциально может иметь любой тип для своих элементов. Когда вы вызываете perms [], компилятор не понимает тип элементов. Вы можете использовать:

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

или

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

тогда компилятор доволен, потому что может выводить конкретный тип списков.

...