11 votes

Comment sauter un terme avec List.Map dans OCAML ?

Supposons que j'ai un code comme celui-ci :

List.map (fun e -> if (e <> 1) then e + 1 else (*add nothing to the list*))

Existe-t-il un moyen de le faire ? Si oui, comment ?

Je veux à la fois manipuler l'élément s'il correspond à certains critères et l'ignorer dans le cas contraire. Ainsi, List.filter ne semble pas être la solution.

1voto

Mirai Mann Points 913

Utiliser

let rec process = function
  | 1 :: t -> process t
  | h :: t -> (h + 1) :: (process t)
  | []     -> []

ou récursif à la queue

let process = 
  let rec f acc = function
    | 1 :: t -> f acc t
    | h :: t -> f ((h + 1) :: acc) t
    | []     -> List.rev acc in
  f []

ou avec une composition de fonctions standard

let process l = 
  l |> List.filter ((<>)1)
    |> List.map ((+)1)

1voto

glennsl Points 9939

La bibliothèque standard d'OCaml a eu List.filter_map depuis 4.08. On peut donc maintenant l'écrire comme suit :

List.filter_map (fun e -> if e <> 1 then Some (e + 1) else None)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X