F # Seq diff - PullRequest
       8

F # Seq diff

13 голосов
/ 21 июля 2009

учитывая две последовательности, как получить все элементы, принадлежащие обеим последовательностям, или все элементы, уникальные для одной из них?

Пример:

let a = [1..10]
let b = [3; 5; 7]

Как вычислить 3 5 и 7 (все элементы общие для обоих списков) и 1, 2, 4, 6, 8, 9, 10 (все элементы не в общий ) * +1010 *

Спасибо

Ответы [ 3 ]

11 голосов
/ 21 июля 2009

То, что вы хотите сделать, это не более чем простые операции над множествами пересечение и разница (или относительное дополнение).

F # имеет модуль Set, чтобы помочь нам здесь. Это должно сделать работу:

let a = [1 .. 10]
let b = [3; 5; 7]

let intersection = Set.intersect (Set.ofList a) (Set.ofList b)
let difference = (Set.ofList a) - (Set.ofList b)

После этого вы, конечно, можете преобразовать результаты в списки, используя Set.toList, если хотите.

Как указывает Мехрдад, это можно сделать альтернативно, используя LINQ (или даже класс HashSet в BCL), но подход здесь, по-видимому, больше всего соответствует духу языка F # (безусловно, самый хороший синтаксически, и, вероятно, самый эффективный тоже).

8 голосов
/ 21 июля 2009

Чуть компактнее:

let a = set [0;1;2;3]
let b = set [2;3;4;5]
let c = a - b
let d = b - a
let e = Set.intersect a b
let f = a + b
> 
val c : Set<int> = seq [0; 1]
val d : Set<int> = seq [4; 5]
val e : Set<int> = seq [2; 3]
val f : Set<int> = seq [0; 1; 2; 3; ...]

Дэнни

4 голосов
/ 21 июля 2009

Не очень F # -я, как я знаю. Вы всегда можете прибегнуть к библиотекам .NET. seq<T> это просто IEnumerable<T>, ничего особенного:

let diff = System.Linq.Enumerable.Except(seq1, seq2); // seq1 - seq2
let intersect = System.Linq.Enumerable.Intersect(seq1, seq2);
let symdiff = System.Linq.Enumerable.Union(System.Linq.Enumerable.Except(seq1, seq2), System.Linq.Enumerable.Except(seq2, seq1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...