Самый эффективный способ создания Data.Set всех пар элементов в Set?

Для произвольного набора, содержащего произвольное количество элементов произвольного типа, например

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

но, конечно, это не может быть лучшим решением?

5
задан Josephine 21 November 2011 в 14:36
поделиться