【问题标题】:trimming a list of pairs with OCaml使用 OCaml 修剪对列表
【发布时间】:2020-05-21 21:02:25
【问题描述】:

我正在尝试过滤对列表并返回一个仅包含每对的第一个元素的新列表。输入/输出应该是这样的:

input = [('A', 3); ('B', 2); ('D', 1)]

output = ['A'; 'B'; 'D']

我目前的代码是这样的:

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 的新手。 任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: list recursion ocaml


    【解决方案1】:

    您的语法问题是由于您有let 而没有对应的in

    let 表达式如下所示:

    let v = expr1 in expr2
    

    本质上,这会建立一个局部变量v,其值为expr1,其值为expr2(其中可能包含变量v 的实例)。

    您缺少 let 表达式的 in 部分。

    作为另一条评论,如果您定义这样的函数:

    let f l = function ...
    

    您正在定义 两个 参数的函数。 function 关键字定义了一个隐式参数;该参数与以下模式匹配。

    您很可能希望从函数定义中删除 l

    您的代码还有一些其他问题,但我希望这有助于取得进展。

    【讨论】:

    • 我认为“让”是一个错误。代码使用| head::tail -> [fst (head)] @ trimList (List.tl l) 更有意义。在这种情况下,我会指出阅读::,并且模式匹配已经绑定tail,所以不需要List.tl l
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多