返回OCaml中元素的索引

返回OCaml中元素的索引,ocaml,Ocaml,x是一个列表,v是列表中的一个元素。需要返回该元素的索引,否则应返回-1 当元素在列表中时,下面的代码可以正常工作,但当未找到时,它不会返回-1 错误是else,让j=1+索引tv在j中,因为它一直在添加1,当传递空列表时,它会执行total=total-1,从而返回最后一个元素的索引 我是一个新的OCaml学习者,不知道如何解决这个问题 let rec index x v = match x with [] -> -1 | h::t -> if

x是一个列表,v是列表中的一个元素。需要返回该元素的索引,否则应返回-1

当元素在列表中时,下面的代码可以正常工作,但当未找到时,它不会返回-1

错误是
else,让j=1+索引tv在j
中,因为它一直在添加1,当传递空列表时,它会执行
total=total-1
,从而返回最后一个元素的索引

我是一个新的OCaml学习者,不知道如何解决这个问题

let rec index x v = 
  match x with
    [] -> -1
    | h::t -> 
      if h == v then 0
      else let j = 1+ index t v in j

首先,你可以直接说
else 1+索引tv
而不是
else让j…

其次,正如您所说的,只要列表中确实存在所需的元素,代码的逻辑就没有错误。随着迭代的继续,您基本上会增加1

但是,很难处理元素不在列表中的情况,因为之前的计数不会停止

为了解决这个问题,最好让我们自己来计算,所以如果没有找到但仍然在列表的中间,那么增加计数;如果确实找到,则返回计数;如果未找到并到达末尾,则返回-1,而不是计数

因此,计数必须是递归函数的一个参数

let index v l =
  let rec aux c = function
    | [] -> None
    | h::t ->
      if h = v then Some c
      else aux (c+1) t
  in 
  aux 0 l
上面的逻辑恰好转换为tailrecursive(您迟早会知道)


p、 在美国,通常使用
h=v
,因为它是值检查
h==v
是物理相等检查,通常我们不希望这样

按注释驾驶:永远不要使用带外sentinel值,如-1(ML)。这就是
选项
类型的用途。如果您认为有帮助,请将答案标记为正确。提问而不打分=没有人会帮助你未来的问题