Ocaml 查找列表中的第一个出现项

Ocaml 查找列表中的第一个出现项,ocaml,caml,Ocaml,Caml,我想查找列表中第一个出现的数字: let pos_list = function (list , x) -> let rec pos = function |([] , x , i) -> i |([y] , x , i) -> if y == x then i |(s::t , x , i) -> if s == x then i else pos(t , x , i + 1) in pos(list , x , 0) ;; 但是编

我想查找列表中第一个出现的数字:

let pos_list = function (list , x) -> 
   let rec pos = function 
    |([] , x , i) -> i
    |([y] , x , i) -> if y == x then i
    |(s::t , x , i) -> if s == x then i else pos(t , x , i + 1) in pos(list , x ,  0) ;;

但是编译器抱怨该表达式是“uint”类型,并与“int”类型一起使用。

从模式匹配中删除第二个大小写。此案例已与最后一个案例匹配,该案例具有
s=y,t=[]
。因此,该函数可以简化为

让位置列表(列表,x)=
让rec pos=函数
|([],x,i)->i
|(s::t,x,i)->如果s==x,那么我在pos(list,x,0)中的其他pos(t,x,i+1);;

为什么要使用
==
(物理相等)来代替结构相等的
=
?我意识到,如果你只有整数,这可能不会有什么不同,但它可能会产生意想不到的行为


请参阅文档中的比较部分:

Pavel Zaichenkov的答案当然是最好的,但您可能有兴趣知道错误的确切原因。也就是说,当你

if y == x then i
如果没有相应的
else
表达式,则整个表达式被视为

if y == x then i else ()
其中,
()
是类型
单元
(而不是
uint
)的唯一值,该类型的表达式仅针对其副作用进行评估。由于
if
的两个分支必须具有相同的类型,
i
也被视为具有类型
单元
。然后,当类型检查模式匹配的第三个分支时,您尝试添加
i
1
,这意味着
i
应该具有类型
int
,因此类型错误