我最近才开始学习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的函数...谢谢您的帮助。
答案 0 :(得分:2)
a
的类型为int list -> int list
,因为max
中的let a = max t
不是引用您的函数,而是引用the one defined in Stdlib
。 Stdlib
(以前称为Pervasives
)包含非常常用的定义,因此默认情况下会为您打开。
Stdlib.max
的类型为'a -> 'a -> 'a
。因此,当您将其传递给int list
时,编译器会推断'a
为int list
并返回类型为int list -> int list
的函数。
为什么max
不引用您自己的max
函数?因为您忘记了rec
关键字。您可能已经知道,rec
使函数可以在其内部调用。
您应该避免隐藏Stdlib
函数名称,以免引起混淆。如果您选择了其他名称,则只会收到一条错误消息,告诉您max
不存在。