import Data.Function ((&))
import Text.Printf
data SaleSum = SaleSum {
}
class SaleSummary s where
summary :: s -> SaleSum
instance Semigroup SaleSum where
(SaleSum c1 q1) <> (SaleSum c2 q2) = SaleSum (c1 + c2) (q1 + q2)
instance Monoid SaleSum where
mempty = SaleSum 0.0 0
instance Show SaleSum
where show (SaleSum cost quantity
) = "Total cost = " ++ printf
"%.2f" cost
++ ", quantity = " ++ show quantity
totalSummary :: SaleSummary s => [s] -> SaleSum
totalSummary xs
= xs &
map summary & mconcat
----------------------------------------------------------------
data Sale = Sale {
-- maybe some other fields
}
instance SaleSummary Sale where
summary s
= SaleSum
(price s
* fromIntegral (quantity s
)) (quantity s
)
testSales = [
Sale "Foo" 0.20 4,
Sale "Bar" 1.10 3
]
main
= print $ totalSummary testSales
aW1wb3J0IERhdGEuRnVuY3Rpb24gKCgmKSkKaW1wb3J0IFRleHQuUHJpbnRmCgpkYXRhIFNhbGVTdW0gPSBTYWxlU3VtIHsKICB0b3RhbENvc3QgICAgIDo6IERvdWJsZSwKICB0b3RhbFF1YW50aXR5IDo6IEludAp9CgpjbGFzcyBTYWxlU3VtbWFyeSBzIHdoZXJlCiAgc3VtbWFyeSA6OiBzIC0+IFNhbGVTdW0KCmluc3RhbmNlIFNlbWlncm91cCBTYWxlU3VtIHdoZXJlCiAgKFNhbGVTdW0gYzEgcTEpIDw+IChTYWxlU3VtIGMyIHEyKSA9IFNhbGVTdW0gKGMxICsgYzIpIChxMSArIHEyKQoKaW5zdGFuY2UgTW9ub2lkIFNhbGVTdW0gd2hlcmUKICBtZW1wdHkgPSBTYWxlU3VtIDAuMCAwCgppbnN0YW5jZSBTaG93IFNhbGVTdW0gd2hlcmUKICBzaG93IChTYWxlU3VtIGNvc3QgcXVhbnRpdHkpID0KICAgICJUb3RhbCBjb3N0ID0gIiArKyBwcmludGYgIiUuMmYiIGNvc3QgKysgIiwgcXVhbnRpdHkgPSAiICsrIHNob3cgcXVhbnRpdHkKCnRvdGFsU3VtbWFyeSA6OiBTYWxlU3VtbWFyeSBzID0+IFtzXSAtPiBTYWxlU3VtCnRvdGFsU3VtbWFyeSB4cyA9IHhzICYgbWFwIHN1bW1hcnkgJiBtY29uY2F0CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpkYXRhIFNhbGUgPSBTYWxlIHsKICBpdGVtSUQgICA6OiBTdHJpbmcsCiAgcHJpY2UgICAgOjogRG91YmxlLAogIHF1YW50aXR5IDo6IEludAogIC0tIG1heWJlIHNvbWUgb3RoZXIgZmllbGRzCn0KCmluc3RhbmNlIFNhbGVTdW1tYXJ5IFNhbGUgd2hlcmUKICBzdW1tYXJ5IHMgPSBTYWxlU3VtIChwcmljZSBzICogZnJvbUludGVncmFsIChxdWFudGl0eSBzKSkgKHF1YW50aXR5IHMpCgp0ZXN0U2FsZXMgPSBbCiAgU2FsZSAiRm9vIiAwLjIwIDQsCiAgU2FsZSAiQmFyIiAxLjEwIDMKICBdCgptYWluID0gcHJpbnQgJCB0b3RhbFN1bW1hcnkgdGVzdFNhbGVz