
On Thu, Feb 19, 2015 at 07:41:25AM +1100, Stuart Hungerford wrote:
prop_left_add_id :: (Eq a, Monoid a) => a -> Bool prop_left_add_id x = zero |+| x == x
monoid_suite :: TestTree monoid_suite = testGroup "monoid" [ testProperty "left additive identity (Integer)" (prop_left_add_id :: Integer -> Bool),
testProperty "left additive identity (Rational)" (prop_left_add_id :: Rational -> Bool),
testProperty "left additive identity ((Integer, Integer))" (prop_left_add_id :: (Integer, Integer) -> Bool), -- ...]
I'm not quite sure what you're asking specifically, but maybe this will help: {-# LANGUAGE ScopedTypeVariables #-} monoid_suite :: forall m. (Eq m, Monoid m) => String -> Proxy m -> TestTree monoid_suite typename _ = testGroup "monoid" [ testProperty ("left additive identity (" ++ typename ++ ")") (prop_left_add_id :: m -> Bool), ... <other general monoid properties here> ] monoid_suite_integer :: TestTree monoid_suite_integer = monoid_suite "Integer" (Proxy :: Integer) monoid_suite_rational :: TestTree monoid_suite_rational = monoid_suite "Rational" (Proxy :: Rational) monoid_suite_pair :: TestTree monoid_suite_pair = monoid_suite "(Integer, Integer)" (Proxy :: (Integer, Integer))