2016-09-10 76 views
0

字典是成對列表。任務是獲取字典並返回一對列表:鍵和值。使用遞歸累積列表時出現類型錯誤

我試着對字典進行迭代(使用遞歸),並在兩個列表中累積鍵和值,但是我得到一個讓我感到困惑的類型錯誤。

注意:我是不是尋找替代解決方案的任務。我想了解錯誤以及如何糾正錯誤。

下面是代碼:

let lists_of_dict dict = 
    let rec separate dict keys values = 
    match dict with 
     [] -> (keys, values) 
    | (k, v)::t -> separate t k::keys v::values 
       (* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *) 
    in 
    separate dict [] [] 

(下劃線部分是第5行的字符19-47)

以下是錯誤消息:

File "lod-problem.ml", line 5, characters 19-47: 
Error: This expression has type 'a list 
     but an expression was expected of type 'b * 'c 

我不能不要理解爲什麼Ocaml推導出這種類型,以及如何使它理解表達式的類型爲('a list * 'b list)(如果我沒有弄錯)。

回答

1

separate t k::keys v::values解析爲(separate t k) :: (keys v) :: values,而不是separate t (k::keys) (v::values)如您所願。

所以OCaml中看到你使用::構建結果,因此其結果將是一個列表(心中永遠的事實,::的論點也有錯誤的類型 - 類型檢查從來沒有得到那麼遠),但預期的結果是一個元組(因爲這是第一個案例產生的)。所以在那個時候類型檢查器出錯了。

+0

謝謝!我將來應該更加自由地使用parens:) – angus