List 使用OCaml修剪成对的列表
我试图过滤一个成对的列表,并返回一个只包含每对的第一个元素的新列表。输入/输出应如下所示:List 使用OCaml修剪成对的列表,list,recursion,ocaml,List,Recursion,Ocaml,我试图过滤一个成对的列表,并返回一个只包含每对的第一个元素的新列表。输入/输出应如下所示: input = [('A', 3); ('B', 2); ('D', 1)] output = ['A'; 'B'; 'D'] let v = expr1 in expr2 let f l = function ... 到目前为止,我掌握的代码如下: let rec trimList l = function | [] -> [] | head::tail -> let l' = [f
input = [('A', 3); ('B', 2); ('D', 1)]
output = ['A'; 'B'; 'D']
let v = expr1 in expr2
let f l = function ...
到目前为止,我掌握的代码如下:
let rec trimList l = function
| [] -> []
| head::tail -> let l' = [fst head] @ trimList List.tl l;;
但我得到了以下错误:
Line 3, characters 59-61:
3 | | head::tail -> let l' = [fst (head)] @ trimList List.tl l;;
^^
Error: Syntax error
我不知道为什么这不起作用。我知道这很简单,但我对OCaml还是新手。
非常感谢您的帮助。您的语法问题是由于您的
let
中没有相应的
let表达式如下所示:
input = [('A', 3); ('B', 2); ('D', 1)]
output = ['A'; 'B'; 'D']
let v = expr1 in expr2
let f l = function ...
本质上,这建立了一个局部变量v
,其值为expr1
,其值为expr2
(可能包含变量v
)
let表达式的
部分缺少
另一个注释是,如果您定义这样的函数:
input = [('A', 3); ('B', 2); ('D', 1)]
output = ['A'; 'B'; 'D']
let v = expr1 in expr2
let f l = function ...
您正在定义一个包含两个参数的函数。有一个由函数
关键字定义的隐式参数;该参数与以下模式匹配
您很可能希望从函数定义中删除l
您的代码还有一些其他问题,但我希望这有助于取得进展。我认为“let”是一个错误。使用|head::tail->[fst(head)]@trimList(List.tl l)
代码更有意义。在这种情况下,我会指向阅读:
,模式匹配已经绑定了尾部
,因此不需要List.tl
。