2011-12-15 3 views
3

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;; 

И я пытался 'когда' заявления, но безрезультатно.

ответ

9

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

я чувствую, Я пробовал это, но это не сработало. Но теперь это сработало. Рокстар, ты. Спасибо за подсказку «когда». – Aspen

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

И этот хвост-рекурсивный ;-) –

+0

Да, это хвост рекурсивный, но я предпочитаю решение с List.map :-) – cago