Discussion:
Monoid over reciprocal of reciprocal sum
박신환
2018-05-06 00:40:19 UTC
Permalink
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)
박신환
2018-05-06 00:52:09 UTC
Permalink
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)
Henning Thielemann
2018-05-06 06:44:03 UTC
Permalink
Post by 박신환
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 (<>).

Loading...