Вы можете сделать это, используя параметр аккумулятора (acc
в приведенном ниже коде). Параметр acc
используется для переноса результата предыдущего вызова в рекурсивную функцию, тем самым создавая конечный результат. Это обычная парадигма в функциональном программировании. В этом случае мы запускаем acc
с пустого списка и добавляем в него элементы, но пропускаем, когда он соответствует x
.
let rec remove x l acc =
match l with
| [] -> acc
| h::t when x = h -> List.append acc t
| h::t -> remove x t (List.append acc [h])
Используйте это так:
remove 1 [1;2;3] []
Еще один способ сделать это - использовать List.collect
:
let remove_use_collect x l =
let helper y =
if x = y then [] else [y]
List.collect helper l
Однако я думаю, что важно понять 1-й метод и как использовать параметры аккумулятора, поскольку он довольно распространен в функциональном программировании, где вы не можете изменять значения. Вы обнаружите, что многие функции модуля List реализованы где-то с помощью аккумулятора.