リストとして表されるパスで動作するモジュールがあります。ほとんどの関数は一般的な再帰リスト処理を実行しますが、パスを変更することがある関数が必要になりました。だから、私はこの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]
通常、組み込みモジュールを拡張する必要があると感じたとき、私は最終的に、奇妙なことや非効率的なことをしていることに気付きます。リスト要素を置き換えることはそれらの1つですか?これを行うためのより簡単な(同等に効率的な)方法はありますか?