Functional programming OCaml理解函数和部分应用

Functional programming OCaml理解函数和部分应用,functional-programming,ocaml,Functional Programming,Ocaml,我正在用OCaml编写一种转换形式,它接受一个函数并接受一个要转换的列表。我知道我的模式匹配在类型检查方面有问题,因为它不会编译并声称类型不匹配,但我不确定我的案例到底出了什么问题。 当我尝试编译时,我收到一个实际的声明错误,它在函数名下面加了下划线 let rec convert (fun: 'b -> 'c option) (l: 'b list) : 'c list = begin match l with | [] -> [] | h::tl -> if f h =

我正在用OCaml编写一种转换形式,它接受一个函数并接受一个要转换的列表。我知道我的模式匹配在类型检查方面有问题,因为它不会编译并声称类型不匹配,但我不确定我的案例到底出了什么问题。 当我尝试编译时,我收到一个实际的声明错误,它在函数名下面加了下划线

 let rec convert (fun: 'b -> 'c option) (l: 'b list) : 'c list =
 begin match l with
| [] -> []
| h::tl -> if f h = Some h then h :: convert f tl
         else convert f tl

end
我编写了以下测试,它应该通过,以确保功能正常工作

let test () : bool =
let f = func x -> if x > 3 then Some (x + 1) else None in
convert f [-1; 3; 4] = [5]
;; run_test "Add one" test
我很有信心这个错误在我的第二个模式比赛中

  • 将来询问编译错误(以及编译器抱怨的位置)时,应该提供确切的错误消息

  • h::convert f tl
    中,
    convert f tl
    'c list
    ,但
    h
    'b
    ,因此不能这样组合它们。
    fh=Some h
    也没有意义:
    fh
    'c选项
    一些h
    'b选项
    。您可能希望匹配
    f h

    | h::tl -> match f h with
                 | Some h1 -> ...
                 | None -> ...
    
  • 将来询问编译错误(以及编译器抱怨的位置)时,应该提供确切的错误消息

  • h::convert f tl
    中,
    convert f tl
    'c list
    ,但
    h
    'b
    ,因此不能这样组合它们。
    fh=Some h
    也没有意义:
    fh
    'c选项
    一些h
    'b选项
    。您可能希望匹配
    f h

    | h::tl -> match f h with
                 | Some h1 -> ...
                 | None -> ...
    

  • 1.好的,谢谢你的建议。此错误在第一行中突出显示函数convert的名称。2.当你说match f h时,你的意思是用h::tl替换模式匹配吗?或者与函数第二行中的'b列表l'匹配?谢谢。您还应该看到错误消息,如下所示:。如果没有,则需要首先修复此问题,因为错误消息非常有用。2.我已经扩展了答案(不完全,因为如果你试着完成它会更好)。好的,谢谢你的建议。此错误在第一行中突出显示函数convert的名称。2.当你说match f h时,你的意思是用h::tl替换模式匹配吗?或者与函数第二行中的'b列表l'匹配?谢谢。您还应该看到错误消息,如下所示:。如果没有,则需要首先修复此问题,因为错误消息非常有用。2.我已经扩展了答案(不完全,因为如果你尝试完成它会更好)。