Thank you guys. I cannot use a explicit type for there are quite a few of them. But from MigMit, I understand why my original cannot work.
On Sat, Jun 22, 2013 at 4:46 AM, Vincent Ambo <taz...@gmail.com> wrote: > Is there a reason why you can't use an explicit type variable? > > {-# LANGUAGE OverloadedStrings, ExistentialQuantification #-} > > import Data.Aeson > import Control.Applicative > import Control.Monad (mzero) > > data ActionData j > = (FromJSON j, ToJSON j) => AD j j > > instance ToJSON (ActionData j) where > toJSON (AD o n) = object [ "oldData" .= o > , "newData" .= n ] > > instance (ToJSON j, FromJSON j) => FromJSON (ActionData j) where > parseJSON (Object v) = AD > <$> v .: "oldData" > <*> v .: "newData" > parseJSON _ = mzero > > > 2013/6/21 Miguel Mitrofanov <miguelim...@yandex.ru> > >> Forgot to reply all, as usual. >> >> -------- Пересылаемое сообщение -------- >> 21.06.2013, 12:52, "Miguel Mitrofanov" <miguelim...@yandex.ru>: >> >> Actually, this is not the real error you should care about. Try removing >> FromJSON instance completely, and you'll get a lot more. And these are >> fundamental: you have to decide what "j" to use when serializing. Haskell >> won't automagically substitute some suitable type for you. >> >> So, that's a classic mismatch: for serializing (ToJSON) you need your "j" >> type to be known to the AD value (meaning: it should be quantified >> existentially), but for deserializing you need it to be any type >> (quantified universally). >> >> All in all, AD seems to be the wrong type. >> >> 21.06.2013, 12:18, "Magicloud Magiclouds" <magicloud.magiclo...@gmail.com >> >: >> >> > data ActionData = AD { oldData :: (FromJSON j, ToJSON j) => j >> > , newData :: (FromJSON j, ToJSON j) => j} >> > instance ToJSON ActionData where >> > toJSON (AD o n) = object [ "oldData" .= o >> > , "newData" .= n ] >> > instance FromJSON ActionData where >> > parseJSON (Object v) = AD >> > <$> v .: "oldData" >> > <*> v .: "newData" >> > parseJSON _ = mzero >> > >> > I got when compile: >> > No instance for (FromJSON (forall j. (FromJSON j, ToJSON j) => j)) >> > arising from a use of `.:' >> > Possible fix: >> > add an instance declaration for >> > (FromJSON (forall j. (FromJSON j, ToJSON j) => j)) >> > In the second argument of `(<$>)', namely `v .: "oldData"' >> > In the first argument of `(<*>)', namely `AD <$> v .: "oldData"' >> > In the expression: AD <$> v .: "oldData" <*> v .: "newData" >> > >> > -- >> > 竹密岂妨流水过 >> > 山高哪阻野云飞 >> > >> > And for G+, please use magiclouds#gmail.com. >> > , >> > _______________________________________________ >> > Haskell-Cafe mailing list >> > Haskell-Cafe@haskell.org >> > http://www.haskell.org/mailman/listinfo/haskell-cafe >> -------- Завершение пересылаемого сообщения -------- >> >> _______________________________________________ >> Haskell-Cafe mailing list >> Haskell-Cafe@haskell.org >> http://www.haskell.org/mailman/listinfo/haskell-cafe >> > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > -- 竹密岂妨流水过 山高哪阻野云飞 And for G+, please use magiclouds#gmail.com.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe