List 每次出现时,用另一个值替换OCaml列表中的某个值

List 每次出现时,用另一个值替换OCaml列表中的某个值,list,recursion,pattern-matching,ocaml,List,Recursion,Pattern Matching,Ocaml,我正在开发一个简单的程序,用列表中的另一个给定值替换某个值(每次出现)。我试着这样做: 但不幸的是,我不能在这里构造时使用。这是我的密码: let rec replace (l:int list) (i:int) (j:int) :int list = match l with | hd::tl -> if hd = i then j::tl else replace tl i j | [] -> l ;; 当我试图替换一个条目时,它不会给

我正在开发一个简单的程序,用列表中的另一个给定值替换某个值(每次出现)。我试着这样做:

但不幸的是,我不能在这里构造时使用
。这是我的密码:

let rec replace (l:int list) (i:int) (j:int) :int list =
    match l with
        | hd::tl -> if hd = i then j::tl else replace tl i j
        | [] -> l
;;

当我试图替换一个条目时,它不会给出完整的列表。相反,它只给出更改后的值。有人能帮我吗?

您对问题的描述与代码不匹配,或者我不明白。如果我尝试你的代码,我会看到:

# replace [1; 4; 1; 4; 2] 4 6 ;;
- : int list = [6; 1; 4; 2]
我看到两个问题。首先,返回值从第一个替换的值开始,而不是从列表的开头开始。其次,只替换一个值,而不是所有值

要解决第一个问题,您必须确保始终返回完整列表。当
hd=i
为false时,您没有返回完整列表


要解决第二个问题,您需要在所有情况下处理列表的尾部。当
hd=i
为真时,您没有处理列表的尾部。

很抱歉我的问题不够清晰,因为我的英语知识不太好。我需要做的事情是#替换[1;4;1;4;2]46;;-:int list=[1;6;1;6;2]您可以看到我需要的只是替换所有的4'sby 6'扫描。请解释当hd=i为真时如何维护尾部?在尾部递归调用
replace