2017-10-05 130 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的列表。所以对你来说一个好的起点将是一个匹配这样的列表的模式。