2011-11-03 51 views
0

我的置換函數:爲什麼當一個空列表被傳入時,我的排列函數會給我一個警告?

 

    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

空列表是一個特殊的列表,它可能有任何類型的元素。當你調用perms []時,編譯器會對元素的類型感到困惑。您可以使用:

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

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

那麼編譯器是幸福的,因爲可以推斷特定類型的列表。

相關問題