Monoid over reciprocal of reciprocal sum

e.g. Parallel resistors, serial capacitors, parallel inductors. newtype RecipSum a = RecipSum {getRecipSum :: a} instance Fractional a => Semigroup (RecipSum a) where RecipSum x <> RecipSum y = RecipSum (recip (recip x + recip y)) sconcat (x :| xs) = mconcat (x : xs). stimes n (RecipSum x) = RecipSum (x / fromIntegral n) instance Fractional a => Monoid (ResipSum a) where mempty = RecipSum (1 / 0) mconcat xs = RecipSum (recip . getSum $ foldMap (Sum . recip . getRecipSum) xs)

e.g. Parallel resistors, serial capacitors, parallel inductors. EDIT: Corrected typo. newtype RecipSum a = RecipSum {getRecipSum :: a} instance Fractional a => Semigroup (RecipSum a) where RecipSum x <> RecipSum y = RecipSum (recip (recip x + recip y)) sconcat (x :| xs) = mconcat (x : xs) stimes n (RecipSum x) = RecipSum (x / fromIntegral n) instance Fractional a => Monoid (RecipSum a) where mempty = RecipSum (1 / 0) mconcat xs = RecipSum (recip . getSum $ foldMap (Sum . recip . getRecipSum) xs)

On Sun, 6 May 2018, 박신환 wrote:
instance Fractional a => Monoid (RecipSum a) where
mempty = RecipSum (1 / 0)
This would fail for Rational. I'd prefer to simply use Sum monoid on reciprocal values. It also has the advantage that you only need to call 'recip' once after a sequence of (<>).
participants (2)
-
Henning Thielemann
-
박신환