{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE GeneralisedNewtypeDeriving #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} import Data.Foldable (fold) import Data.Monoid (Sum (..)) newtype Currency a = Currency a deriving (Show) deriving stock (Eq) -- Deriving strategies; Stock is the default strategy. deriving (Semigroup) via (Sum a) -- Deriving via -- Standalone deriving deriving instance Read a => Read (Currency a) -- Standalone deriving and deriving strategies; Newtype is the newtype strategy. deriving newtype instance Ord a => Ord (Currency a) -- Standalone deriving, deriving strategies and deriving via; Num is a constraint for Sum. deriving via (Sum a) instance Num a => Monoid (Currency a) main :: IO () main = do print $ fold $ fmap Currency [2, 3, 5, 7, 11]