Является ли замена элемента списка шаблоном против -?

У меня есть модуль, который работает с путями, представленными в виде списков. Большинство функций выполняют типичную рекурсивную обработку списка, но теперь мне нужна функция, которая иногда изменяет путь. Итак, я написал эту replaceфункцию:

module List =
  let replace f sub xs = 
    let rec finish acc = function
      | [] -> acc
      | x::xs -> finish (x::acc) xs
    let rec search acc = function
      | [] -> None
      | x::xs -> 
        if f x then Some(finish ((sub x)::xs) acc)
        else search (x::acc) xs
    search [] xs

который работает так:

let xs = List.init 10 id
let res = List.replace ((=) 5) (fun _ -> -1) xs
//Some [0; 1; 2; 3; 4; -1; 6; 7; 8; 9]

Обычно, когда я чувствую необходимость расширить встроенный -модуль, я в конце концов обнаруживаю, что делаю что-то странное или неэффективное. Является ли замена элемента списка одной из таких вещей? Есть ли более простой (столь же эффективный )способ сделать это?

10
задан Daniel 12 July 2012 в 15:34
поделиться