интересно как можно оптимизировать по времени, наверняка с лёту накидаете кучу крутых вариантов с параллельными последовательностями и прочими заумными вещами) Вот пара простых вариантов:
type Comparer<'a>(f) =
interface System.Collections.Generic.IEqualityComparer<'a> with
member x.Equals(a, b) =
f a b
member x.GetHashCode(a) = hash(a.ToString())
let haveIntersection eq (l1 : 'a list) l2 =
l1 |> List.exists (fun a -> l2 |> List.exists (fun b -> eq a b))
let _haveIntersection eq (l1 : 'a list) l2 =
l1.Intersect(l2, Comparer<'a>(eq)).Any()
let l1 = [1L .. 10000L]
let l2 = [1L .. 10000L]
let eq a b = a = b && a = 10000L
> _haveIntersection eq l1 l2;;
Real: 00:00:00.007, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0
val it : bool = true
> haveIntersection eq l1 l2;;
Real: 00:00:06.355, CPU: 00:00:06.328, GC gen0: 0, gen1: 0, gen2: 0
val it : bool = true