Recursion 在Ocaml中查找列表中的最大/最小值

Recursion 在Ocaml中查找列表中的最大/最小值,recursion,compiler-errors,ocaml,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;; 让max

我最近刚开始学习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;;
让max:int列表->int
=乐趣lst->
匹配lst与
|[] -> 0
|h::[]->h
|h::t->让a=最大t进入
如果h
Ocaml一直在说:

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


我不明白为什么a是一个整型列表,虽然我声称它是一个最大t,这是一个函数,使整型列表成为整型。。。感谢您的帮助。

a
具有类型
int list->int list
,因为
中的
max
让a=max t
不引用您的函数,而是引用
Stdlib
(以前称为
pervisives
)包含非常常用的定义,因此默认情况下为您打开

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

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


您应该避免隐藏Stdlib
函数名,以避免类似这样的混淆错误。如果您选择了不同的名称,您只会得到一个错误,告诉您
max
不存在。

a
具有类型
int list->int list
,因为
中的
max
让a=max t
不是指您的函数,而是指
Stdlib
(以前称为
pervisives
)包含非常常用的定义,因此默认情况下为您打开

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

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

您应该避免隐藏Stdlib函数名,以避免类似这样的混淆错误。如果您选择了不同的名称,您只会得到一个错误,告诉您
max
不存在