我有一个适用于以列表表示的路径的模块。大多数函数都进行典型的递归列表处理,但现在我需要一个有时会改变路径的函数。所以,我写了这个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]
通常,当我觉得需要扩充一个内置模块时,我最终会发现我在做一些古怪或低效的事情。替换列表元素是其中之一吗?有没有更简单(同样有效)的方法来做到这一点?