在Ocaml列表中查找最大/最小编号

时间:2019-09-29 17:33:53

标签: recursion compiler-errors ocaml

我最近才开始学习Ocaml,现在才开始练习一些代码。 在这种情况下,我试图在列表中找到最大数量,但它不断向我返回错误消息。

let max: int list -> int
= fun lst ->
match lst with
 |[] -> 0
 |h::[] -> h
 |h::t -> let a = max t in
            if h < a then h
            else
             a;;

Ocaml一直在说:

  

错误:此表达式的类型为int list-> int list,但应为int类型的表达式。

我不明白为什么a是一个int列表,尽管我声称它是max t,这是一个将int列表转换为int的函数...谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

a的类型为int list -> int list,因为max中的let a = max t不是引用您的函数,而是引用the one defined in StdlibStdlib(以前称为Pervasives)包含非常常用的定义,因此默认情况下会为您打开。

Stdlib.max的类型为'a -> 'a -> 'a。因此,当您将其传递给int list时,编译器会推断'aint list并返回类型为int list -> int list的函数。

为什么max不引用您自己的max函数?因为您忘记了rec关键字。您可能已经知道,rec使函数可以在其内部调用。

您应该避免隐藏Stdlib函数名称,以免引起混淆。如果您选择了其他名称,则只会收到一条错误消息,告诉您max不存在。

相关问题