Я довольно новичок в функциональном программировании и у меня есть некоторые проблемы с задачей обработки списка. У меня есть коллекция записей, таких как:
type TestRec = {
Id : string
Amount : int }
Теперь я хочу удалить все элементы в списке, которые строят пару друг с другом. Например, если есть два элемента с Amount
из 7
и -7
, оба элемента должны быть удалены из списка. Если есть третий элемент с Amount = 7
, он должен остаться в списке.
Надеюсь, вы, ребята, можете понять, что я пытаюсь сделать. Это то, что я до сих пор придумал (но это пока не работает правильно):
let removeDoubles items =
items
|> Seq.groupBy (fun i -> Math.Abs(i.Amount))
|> Seq.map snd
|> Seq.filter (fun i -> Seq.length i = 1)
Edit:
Функция, которая определяет, соответствуют ли два элемента друг другу, может быть более сложной, чем описано выше (Math.Abs
). Я подумал, что это будет хороший пример со значениями Amount
, но это может быть любая функция предиката.
Редактировать 2:
Чтобы прояснить еще немного, я хочу дать более реалистичное описание возможной связанной проблемы. Вы можете представить расчет счета, в котором список состоит из всех позиций счета. Теперь вы хотите удалить все пары позиций счетов-фактур, которые имеют, например, один и тот же «номер товара», «валюта» и цены равны нулю.
Может быть, этот пример поможет объяснить мою проблему. Я просто подумал, что может быть более «функциональный» способ решения этой проблемы, чем два цикла, бегущих по списку, и удаление элементов, как я сделал бы в императивном языке.