This library provides a method of deriving Semigroup
and Monoid
instances
for your large product types. It does this using GHC generics, and can provides
a mechanism for using the DerivingVia
extension to reduce boilerplate.
It only works if each field of your product type is itself a Semigroup
/Monoid
.
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Monoid.Generic
data BigProduct = BigProduct
{ theList :: [Int]
, theSum :: Sum Double
, theString :: String
} deriving (Generic, Eq)
deriving Semigroup via GenericSemigroup BigProduct
deriving Monoid via GenericMonoid BigProduct
useIt :: Bool
useIt = (mempty <> mempty) == BigProduct [] 0 ""