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 <miguelimo38@yandex.ru>
Forgot to reply all, as usual.

-------- Пересылаемое сообщение  --------
21.06.2013, 12:52, "Miguel Mitrofanov" <miguelimo38@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.magiclouds@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