2017-10-19 176 views
0

我在OCaml的一個函數,它應該合併兩個列表:這個表達鍵入「列表,但預計類型的表達式」一

let rec merge (list1, list2) = 
    match (list1, list2) with 
     ([], []) -> merge (List.tl list1, List.tl list2) :: List.hd list1 :: List.hd list2 
     |(_, []) -> merge (List.tl list1, list2) :: List.hd list1 
     |([], _) -> merge (list1, List.tl list2) :: List.hd list2;; 

但由於某些原因,編譯器不會讓這樣的代碼通過退出:

Error: This expression has type 'a list but an expression was expected of type 'a The type variable 'a occurs inside 'a list

我該如何指定這些列表'我試圖通過,而不是'一個?

回答

2

首先,這個功能不起作用。如果兩個列表爲空,則合併尾部並連接它們中的每一個的頭部,但是...呃...它們是空的...

無論如何,您的問題是您使用的是::運算符串聯),其類型爲'a -> 'a list -> 'a list,所以左邊的成員應該是一個元素,右邊的是列表,左邊的是列表,右邊是元素,所以它不能工作。

關於你的問題,因爲類型推斷,你不能告訴你是對的編譯器,他是錯的,在這種情況下,錯誤是真正明確:

List.tl l (* 'a list *) :: List.hd l (* 'a *) 

將始終返回錯誤,因爲你有一個無限的類型(因爲::'a -> 'a list -> 'a list型的,我讓你嘗試確定一個有限型'a,可以搭配您的串聯)

所以,我想你想做的事是這樣的:

let rec merge (list1, list2) = 
    match list1, list2 with 
     | [], _ -> list2;; 
     | hd :: tl, _ -> hd :: merge tl list2 
相關問題