【问题标题】:OCaml Understanding Functions and Partial ApplicationsOCaml 理解函数和部分应用
【发布时间】:2017-02-18 18:01:00
【问题描述】:

我正在用 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

我很确定错误出现在我的第二次模式匹配中。

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:
    1. 您应该在以后询问编译错误时提供确切的错误消息(以及编译器抱怨的位置)。

    2. h :: convert f tl中,convert f tl'c list,但h'b,所以不能这样组合。 f h = Some h 也没有意义:f h'c optionSome h'b option。你可能想匹配f h

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

    【讨论】:

    • 1.会的,谢谢你的建议。此错误在第一行中强调了函数的名称 convert。 2. 当你说匹配 f h 时,你的意思是用 h::tl 替换模式匹配吗?还是与函数第二行中的 'b 列表 l 匹配?谢谢。
    • 1.您还应该看到错误消息,如下所示:ocaml.org/learn/tutorials/common_error_messages.html。如果您不这样做,则需要先修复此问题,因为错误消息非常有用。 2.我已经扩展了答案(不完整,因为如果你尝试完成它会更好)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2013-02-23
    • 2013-07-08
    相关资源
    最近更新 更多