exchange (exchangeRateRecip x) . exchange x == idUse the Identity law for reasoning about going back and forth between src and dst in order to manage any leftovers that might not be representable as a Discrete monetary value of src.
denominator x /= 0 && x > 0 ⇒ exchangeRate x == Just (exchangeRate' x)
denominator x == 0 || x <= 0 ⇒ undefined == exchangeRate' x
exchangeRateRecip . exchangeRateRecip == idNote: If ExchangeRate had a Fractional instance, then exchangeRateRecip would be the implementation of recip.
> exchangeRateToDecimal defaultDecimalConf Round <$> (exchangeRate (123456 % 100) :: Maybe (ExchangeRate "USD" "EUR")) Just "1,234.56"
exchangeRate (12345 % 10000) :: Maybe (ExchangeRate "USD" "GBP")