2011-12-15 63 views
3

例如如果你有一个功能(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;; 

我累了, '何时' 的语句,但无济于事。

回答

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 
+0

我觉得我尝试过,但它不起作用 - 但它现在才起作用。 Rockstar,你。 感谢您提供'何时'的提示。 – Aspen 2011-12-15 09:49:50

2

实际上,你可以使用一个when声明,就算我喜欢@垫的解决方案:

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 
+1

这是一个尾递归;-) – 2012-02-23 09:43:58

相关问题