Для произвольного набора, содержащего произвольное количество элементов произвольного типа, например
mySet1 = Set.fromList [1,2,3,4]
или
mySet2 = Set.fromList ["a","b","c","d"]
или
mySet3 = Set.fromList [A, B, C, D]
для некоторых конструкторов данных A, B, C, D, ...
Каков наиболее эффективный с вычислительной точки зрения способ сгенерировать набор всех неупорядоченных пар элементов - это заданный набор ? Т.е.
setPairs mySet1 == Set.fromList [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
или
setPairs mySet2 == fromList [ ("a","b")
, ("a","c")
, ("a","d")
, ("b","c")
, ("b","d")
, ("c","d") ]
или
setPairs mySet2 == fromList [ (A,B)
, (A,C)
, (A,D)
, (B,C)
, (B,D)
, (C,D) ]
Моё первоначальное наивное предположение было бы таким:
setPairs s = fst $ Set.fold
(\e (pairAcc, elementsLeft) ->
( Set.fold
(\e2 pairAcc2 ->
Set.insert (e2, e) pairAcc2
) pairAcc $ Set.delete e elementsLeft
, Set.delete e elementsLeft )
) (Set.empty, s) s
но, конечно, это не может быть лучшим решением?