在 OCAML 中正确使用 'in' 关键字

Correctly using 'in' keyword in OCAML

我最近开始研究 OCAML。我正在阅读《现代编程语言》第 2 版一书。关于 ML 的第一章有一个练习,要求定义 int list -> int 类型的函数 max 到 return 整数列表中的最大元素。另外还有一个提示,建议包含一个辅助函数 maxhelper ,它作为第二个参数采用当前最大的元素。那么max定义为:

fun max x = maxhelper (tl x, hd x)

我正在尝试在 OCAML 中实现它。这是我的代码:

let max x =
  let rec maxhelper x cur_max =
    match x with
    | [] -> cur_max
    | h::t -> 
        if cur_max < h then maxhelper t h 
        else maxhelper t cur_max
  in maxhelper List.tl(x) List.hd(x)
;;

这会导致我无法理解的错误:这个表达式, 即最后一行 List.tl(x) 的类型 的类型为“a list ->”一个列表 但是期望表达式的类型为 ('b -> 'c -> 'd) list

令我困惑的是,当我单独编写 maxhelper 函数并为其提供参数 [2;3;4] 1(原始列表为 [1;2;3;4])时,它可以正常工作。此外,如果我将 in 下提供的参数替换为

in maxhelper x 0

代码编译并正确运行(对于非负数)。关于将参数传递给 in 或我收到的错误消息,我不确定我错过了什么。主要是为什么追加一个List()调用会报错?

你在用 Algolic 语言编写函数调用,这是我认为的基本问题。

而不是

maxhelper List.tl(x) List.hd(x)

你应该

maxhelper (List.tl x) (List.hd x)

按照您的写法,有 4 个参数传递给 maxhelperList.tlxList.hdx