У меня есть модуль, который работает с путями, представленными в виде списков. Большинство функций выполняют типичную рекурсивную обработку списка, но теперь мне нужна функция, которая иногда изменяет путь. Итак, я написал эту 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]
Обычно, когда я чувствую необходимость расширить встроенный -модуль, я в конце концов обнаруживаю, что делаю что-то странное или неэффективное. Является ли замена элемента списка одной из таких вещей? Есть ли более простой (столь же эффективный )способ сделать это?