2013-03-10 85 views
1

如何在OCaml中将所有等于c的元素替换为t如何更改列表中相同的所有元素?

我试图List.filter没有成功:

List.fold_right (fun c -> t) (List.filter c myLst) [] 

是否List模块包含此任务的功能?

+0

当你说'改变了't'',你的意思是所有元素'c'应该被替换为't'?新列表是否应该包含所有非'c'元素,并且每个'c'都应该被替换为't'? – 2013-03-10 12:36:27

+0

只有每个c。非c元素不会更改。 – 2013-03-10 12:48:38

回答

3

您可以使用map(见List module):

open Printf;; 

let l = ['a'; 'b'; 'c'; 'd'; 'c'] 
let l2 = List.map (fun x -> if (x = 'c') then 't' else x) l;; 
List.iter (printf "%c ") l2;; 

它打印

a b t d t 
+1

我相信你最好在你的代码中使用(x ='c')而不是x =='c'。 – octref 2013-03-10 14:56:12

1

如果你想使用List.fold_right,这里是做它的方式:

let replace lst = List.fold_right (fun elmt accum -> 
    let e = if elmt = 'c' then 't' else elmt in 
    e::accum 
) lst [];; 
     val replace : char list -> char list = <fun> 
# replace ['a'; 'b'; 'c'];; 
- : char list = ['a'; 'b'; 't'] 

注意:不要用==代替=在OCaml中,它们有不同的含义。 ==测试物理平等,但=测试语义平等。所以当你使用==时,即使两个值在语义上相等,它也可能返回false。

相关问题