OCaml函数:替换列表中的元素

6

我刚接触OCaml,需要一个简单的函数来替换列表中的元素。

经过一段时间的尝试,我成功实现了这个功能,但是我不想在函数中使用计数参数。

let rec replaceelem ls x elem count=
  match ls with
  | [] -> ls
  | h::t -> if (count = x) then
          elem::(replaceelem t x elem (count+1))
        else
          h::(replaceelem t x elem (count+1))

示例

# let a = [1;2;3;4;5];;
val a : int list = [1; 2; 3; 4; 5]
# replaceelem a 3 99 0;;
- : int list = [1; 2; 3; 99; 5]

1
将您的replaceelem函数包装在另一个函数中,该函数仅接受新元素和旧列表,并从该函数内部调用您的递归版本。 - user1971598
2个回答

5
使用List.mapi - 在遍历列表时提供元素的索引 -
let replace l pos a  = List.mapi (fun i x -> if i = pos then a else x) l;;

1
如果你想要摆脱那个多余的输入(计数器),你可以在函数内部通过在递归调用中运行x-1来跟踪你与所需索引(你试图替换的那个)的关系,并在x=0时替换正确的元素。就像这样:
let rec replaceelem ls x elem =
  match ls with
  | [] -> ls
  | h::t -> if (x=0) then
              elem::(replaceelem t (x-1) elem)
            else
              h::(replaceelem t (x-1) elem)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接