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
,因此类型错误