haskellaeson

How to override type class instance from package


In aeson.Types.ToJSON, there is already one call instances for ToJSON (Ratio Integer) but it is show number like ("A" % "B") in JSON, I would like to make a custom version (sort of float-alike numbers) some where in my code:

instance ToJSON (Ratio Integer) where
  toJSON r = String $ pack $ show $ (numerator r) / (denominator r)

Then the GHC tells me it's overlapping, is there any way I can override the one from Data.Aeson.Typtes.ToJSON for Ratio Integer ?

Thank you

enter image description here


Solution

  • You don't, typically you introduce a "signal interface", like:

    newtype MyRatio = MyRatio (Ratio Integer)
    
    instance ToJSON MyRatio where
      toJSON (MyRatio r) = String $ pack $ show $ (numerator r) / (denominator r)

    and you thus wrap the values to serialize in the MyRatio data constructor.