2017-10-05 159 views
-2

我想將我的第一個兩個元素添加到我的列表中,OCaml匹配錯誤

我在第三行發生錯誤,爲什麼?

let addfirsttwo lst = 
    match lst with 
    | List.hd lst + List.hd (List.tl lst) 
;; 
+2

什麼是錯誤?請將其納入問題主體,也許包括標題。 (想想那些試圖解決同樣問題的人) – user5226582

回答

1

您可以混合使用兩種不同的方法從列表中提取信息。一種是使用List.hdList.tl,另一種是模式匹配。

與前者一樣,你差不多完成了。你只需要擺脫模式 匹配的,像這樣:但是

let addfirsttwo lst = 
    List.hd lst + List.hd (List.tl lst) 

我認爲,你的問題涉及到了一些功課,其中List.hdList.tl是被禁止的。而且,無論如何,模式匹配對於瞭解有用。 所以你的代碼的問題是你沒有完成模式匹配。一種圖案匹配子句形式

| <some pattern> -> <some expression> 

圖案通常cpontains變量,然後可以在表達式中使用。定義List.hd的一種方式,例如,是

let hd list = match list with 
| head::tail -> head 

您的條款是缺少實際的模式和->。修復您的代碼,至少語法的另一種方式,會一直提供缺少的部分,像這樣:

let addfirsttwo lst = 
    match lst with 
    | _ -> List.hd lst + List.hd (List.tl lst) 

其中_作爲通配符,將在所有匹配任何值,而不是綁定任何變量。但是,它不會解決假定的功課限制。

值得注意的是,我給出的hd的模式不符合所有值。它只匹配長度至少爲1的列表。這很好,因爲List.hd只需要支持非空列表。你的函數只需要支持長度至少爲2的列表。所以對你來說一個好的起點將是一個匹配這樣的列表的模式。