如何将函数映射到列表中的某些元素?

时间:2011-12-15 09:05:40

标签: list map if-statement functional-programming ocaml

E.g。如果您有一个功能(fun x -> x+1),并且想要将其映射到[1; 2; 3]。但您只想在x=1时映射它,以便输出为[2; 2; 3]。你是怎么做到的?

使用OCaml,我试过了:

let rec foo (input : int list) : int list =
match input with
    | [] -> []
    | hd::tl -> List.map (fun x -> if x=1 then (x+1)) input;;

我已经尝试'何时'陈述,但无济于事。

2 个答案:

答案 0 :(得分:9)

此处缺少else分支。

你快到了。你只需要制作一个完整的if / else语句:

if x=1 then (x+1) else x

OCaml需要在上面表达式的任何分支上返回值。

要明确,when后卫在这里无关紧要,因为它用于条件模式匹配。由于在这种情况下模式匹配是多余的,因此您的功能可以缩短很多:

let foo input =
    List.map (fun x -> if x=1 then x+1 else x) input

答案 1 :(得分:2)

您实际上可以使用when语句,即使我更喜欢@pad的解决方案:

let foo (input : int list) : int list = 
  let rec aux acc input = 
   match input with
      [] -> List.rev acc
    | x :: xs when x = 1 -> aux ((x + 1) :: acc) xs
    | x :: xs -> aux (x :: acc) xs
  in
  aux [] input