Почему моя функция перестановок выдает предупреждение, когда передается пустой список?

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


    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

Похоже, что я достиг обобщенных переменных, по крайней мере, для меня.


person Nate    schedule 03.11.2011    source источник


Ответы (1)


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

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

or

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

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

person pad    schedule 03.11.2011