Skip to content

Could not deduce RecordFromJSON' and RecordToPairs in aeson-2.2.0.0 #1059

Open
@julmb

Description

I have the following code

{-# LANGUAGE DeriveGeneric #-}

import Data.Aeson
import GHC.Generics

data Item f a = Item { root :: a, children :: f a } deriving Generic1

instance FromJSON1 f => FromJSON1 (Item f) where liftParseJSON = genericLiftParseJSON defaultOptions
instance ToJSON1 f => ToJSON1 (Item f) where liftToJSON = genericLiftToJSON defaultOptions
instance (FromJSON1 f, FromJSON a) => FromJSON (Item f a) where parseJSON = parseJSON1
instance (ToJSON1 f, ToJSON a) => ToJSON (Item f a) where toJSON = toJSON1

data Content f a = Content { items :: f (Item f a) } deriving Generic1

instance (Functor f, FromJSON1 f) => FromJSON1 (Content f) where liftParseJSON = genericLiftParseJSON defaultOptions
instance (Functor f, ToJSON1 f) => ToJSON1 (Content f) where liftToJSON = genericLiftToJSON defaultOptions
instance (Functor f, FromJSON1 f, FromJSON a) => FromJSON (Content f a) where parseJSON = parseJSON1
instance (Functor f, ToJSON1 f, ToJSON a) => ToJSON (Content f a) where toJSON = toJSON1

main :: IO ()
main = return ()

With aeson-2.1.2.1, this code works perfectly fine. With aeson-2.2.0.0, I get the following errors:

Main.hs:15:82: error:
    • Could not deduce (aeson-2.2.0.0:Data.Aeson.Types.FromJSON.RecordFromJSON'
                          One (f :.: Rec1 (Item f)))
        arising from a use of ‘genericLiftParseJSON’
      from the context: (Functor f, FromJSON1 f)
        bound by the instance declaration at Main.hs:15:10-58
    • In the expression: genericLiftParseJSON defaultOptions
      In an equation for ‘liftParseJSON’:
          liftParseJSON = genericLiftParseJSON defaultOptions
      In the instance declaration for ‘FromJSON1 (Content f)’
   |
15 | instance (Functor f, FromJSON1 f) => FromJSON1 (Content f) where liftParseJSON = genericLiftParseJSON defaultOptions
   |                                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Main.hs:16:10: error:
    • Could not deduce (aeson-2.2.0.0:Data.Aeson.Types.ToJSON.RecordToPairs
                          (Data.Aeson.Encoding.Internal.Encoding' Value)
                          Series
                          One
                          (S1
                             ('MetaSel
                                ('Just "items")
                                'NoSourceUnpackedness
                                'NoSourceStrictness
                                'DecidedLazy)
                             (f :.: Rec1 (Item f))))
        arising from a use of ‘aeson-2.2.0.0:Data.Aeson.Types.ToJSON.$dmliftToEncoding’
      from the context: (Functor f, ToJSON1 f)
        bound by the instance declaration at Main.hs:16:10-54
    • In the expression:
        aeson-2.2.0.0:Data.Aeson.Types.ToJSON.$dmliftToEncoding
          @(Content f)
      In an equation for ‘liftToEncoding’:
          liftToEncoding
            = aeson-2.2.0.0:Data.Aeson.Types.ToJSON.$dmliftToEncoding
                @(Content f)
      In the instance declaration for ‘ToJSON1 (Content f)’
   |
16 | instance (Functor f, ToJSON1 f) => ToJSON1 (Content f) where liftToJSON = genericLiftToJSON defaultOptions
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Main.hs:16:75: error:
    • Could not deduce (aeson-2.2.0.0:Data.Aeson.Types.ToJSON.RecordToPairs
                          Value
                          (dlist-1.0:Data.DList.Internal.DList
                             aeson-2.2.0.0:Data.Aeson.Types.Internal.Pair)
                          One
                          (S1
                             ('MetaSel
                                ('Just "items")
                                'NoSourceUnpackedness
                                'NoSourceStrictness
                                'DecidedLazy)
                             (f :.: Rec1 (Item f))))
        arising from a use of ‘genericLiftToJSON’
      from the context: (Functor f, ToJSON1 f)
        bound by the instance declaration at Main.hs:16:10-54
    • In the expression: genericLiftToJSON defaultOptions
      In an equation for ‘liftToJSON’:
          liftToJSON = genericLiftToJSON defaultOptions
      In the instance declaration for ‘ToJSON1 (Content f)’
   |
16 | instance (Functor f, ToJSON1 f) => ToJSON1 (Content f) where liftToJSON = genericLiftToJSON defaultOptions
   |                                                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

I looked at the changelog, and while there have apparently been some changes to the handling of Generics related to omitted fields, I did not find anything that would indicate that my situation should no longer work. Is this a regression or am I doing something wrong?

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions