haskell / cabal

Official upstream development repository for Cabal and cabal-install
https://haskell.org/cabal
Other
1.61k stars 691 forks source link

Monoid instance for CondTree #2735

Open hvr opened 9 years ago

hvr commented 9 years ago

When experimenting with the Cabal solver, I've defined the following orphan Monoid instance:

instance (Monoid c, Monoid a) => Monoid (CondTree v c a) where
    mempty = CondNode mempty mempty mempty

    mappend cn1 cn2 =
        CondNode { condTreeData        = mappend (condTreeData        cn1) (condTreeData        cn2)
                 , condTreeConstraints = mappend (condTreeConstraints cn1) (condTreeConstraints cn2)
                 , condTreeComponents  = mappend (condTreeComponents  cn1) (condTreeComponents  cn2)
                 }

    mconcat cns =
        CondNode { condTreeData        = mconcat (map condTreeData        cns)
                 , condTreeConstraints = mconcat (map condTreeConstraints cns)
                 , condTreeComponents  = mconcat (map condTreeComponents  cns)
                 }

Does this instance make sense to be added to Cabal?

/cc @kosmikus

phadej commented 9 years ago

This make sense as c is often (always?) [Dependency] which we treat as a conjunction of dependencies.

EDIT instance (MeetSemiLattice c, Monoid a) => Monoid (CondTree v c a) would be more informative, if we had that typeclass.

ezyang commented 7 years ago

Yes, this seems correct.