Работаю с Aeson, довольно сложный json файл с несколькими уровнями вложенности, для каждого типа прописал инстансы для FromJSON, работаю с самым верхнем уровнем, вот так выглядит инстанс:
-- high level data
data Cfg = Cfg { nm :: CProperty,
author :: CProperty,
langs :: CValue,
grops :: CListArr,
projs :: CPropArr
} deriving (Show)
...
-- |this instance is specific for different files
-- based on common functions to work with most of nested json code
instance FromJSON Cfg where
parseJSON _ = mzero
parseJSON (Object o) = do
nm <- (parseJSON :: Value -> J.Parser CProperty) =<< (o .: T.pack "Name")
autor <- (parseJSON :: Value -> J.Parser CValue) =<< (o .: T.pack "Author")
langs <- (parseJSON :: Value -> J.Parser CProperty) =<< (o .: T.pack "Languages")
groups <- (parseJSON :: Value -> J.Parser CListArr) =<< (o .: T.pack "Groups")
projs <- (parseJSON :: Value -> J.Parser CPropArr) =<< (o .: T.pack "Projects")
return $ Cfg nm author langs groups projs
Собственно ищется json - ское значение по имени и перенаправляется в нужный инстанс для корректной обработки, например дальнейшее разложение в глубину. В конце пытаюсь собрать общее значение.
Компилятор ругается так:
Config.hs:121:21:
Couldn't match expected type `CProperty'
with actual type `Cfg -> CProperty'
In the second argument of `Cfg', namely `author'
In the second argument of `($)', namely
`Cfg nm author langs groups'
In the expression: return $ Cfg nm author langs groups
Failed, modules loaded: none.
Собственно по делу ругается, как можно явно преобразовать из типа (Cfg -> CProperty) в CProperty ? (оба созданы как data и являются кастомными типами, и могут использоваться в других кастомных типах)