【问题标题】:Correctly using 'in' keyword in OCAML在 OCAML 中正确使用“in”关键字
【发布时间】:2022-01-22 14:07:58
【问题描述】:

我最近开始研究 OCAML。我正在阅读《现代编程语言》第 2 版一书。关于 ML 的第一章有一个练习,需要定义 int list -> int 类型的函数 max 以返回整数列表中的最大元素。还有一个提示建议包含一个辅助函数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 -> 'a list 但是需要一个类型为 ('b -> 'c -> 'd) 列表的表达式

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

in maxhelper x 0

代码编译并正常工作(对于非负数)。我不确定我在将参数传递给in 时遗漏了什么,或者我收到的错误消息。主要是List()调用的附加为什么会报错?

【问题讨论】:

    标签: functional-programming ocaml ml


    【解决方案1】:

    您正在像使用 Algolic 语言一样编写函数调用,这是我认为的基本问题。

    代替

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

    你应该有

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

    按照您的编写方式,有 4 个参数被传递给 maxhelperList.tlxList.hdx

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      相关资源
      最近更新 更多