Как сопоставить функцию только определенным элементам в списке? - PullRequest
3 голосов
/ 15 декабря 2011

Например, если у вас есть функция (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 ]

9 голосов
/ 15 декабря 2011

Ветвь else здесь отсутствует.

Вы почти у цели.Вам просто нужно сделать полный оператор if / else:

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

OCaml требует возвращаемого значения для любой ветви вышеприведенного выражения.

Чтобы быть понятным, when guard здесь не важен, потому что он используется для сопоставления с образцом.Поскольку сопоставление с образцом в этом случае является избыточным, ваша функция может быть значительно сокращена:

let foo input =
    List.map (fun x -> if x=1 then x+1 else x) input
2 голосов
/ 23 февраля 2012

Вы можете использовать оператор 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
...