2011-12-15 93 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

相關問題