LINUX.ORG.RU

Aeson, преобразование типов

 aeson,


0

1

Работаю с 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 и являются кастомными типами, и могут использоваться в других кастомных типах)



Последнее исправление: Sigrlami (всего исправлений: 1)

Ответ на: комментарий от Macil

Копипаста

Не, это я скопировал плохо, до того не доходит. Ругается уже на первом параметре т.к у него тип не явный, а перенаправления, а там разбирается без возвращаемого типа, а по инстансу.

Видел как так делали на забугорных форумах, но в более простых примерах

P.S: поправил код

Sigrlami
() автор топика
Ответ на: комментарий от dmitry_malikov

а подробнее? последовательность вычислений я использую в следующих инстасах, а тут где?

Sigrlami
() автор топика
Ответ на: Копипаста от Sigrlami

P.S: поправил код

Тогда следующее замечание.

... author :: CProperty
... autor <- (parseJSON :: Value -> J.Parser CValue)
return $ Cfg nm author langs groups projs

Во-первых типы неправильно объявлены. Во-вторых опечатался. И в Cfg вторым параметром передаешь функцию.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Блин, спасибо, помогло. Вот это бок по невнимательности, я думал, что что- то не так уже делаю.

Второй параметр не функция будет, а результат последовательности выполнений, оно еще несколько инстансов FromJSON проходит для сложновложенных частей json и в конце record кастомного типа будет.

Ну это такое, Спасибо, еще раз.

Sigrlami
() автор топика
Ответ на: комментарий от Sigrlami

Ну это такое, Спасибо, еще раз.

Всегда пожалуйста. А чтобы такого рода ошибок больше не было освой Applicative-нотацию

Foo <$> bar <*> baz <*> quux <*> ... <*> zzz

Кстати, у Брайена тоже Applicative головного мозга, и меня он, подлюга, тоже конкретно заразил. Еше своим attoparsec, не говоря уж про сабж.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Да, я умею с Applicative работать, так делаю в других инстансах, но обычно когда много коротких выражений. А в таком виде решил разнести т.к длинные перенаправления типа

(parseJSON :: Value -> J.Parser CProperty) бла бла <*> (parseJSON :: Value -> J.Parser CProperty) бла бла  
мне не всегда удобно читать, хотя и их можно разнести =)

Sigrlami
() автор топика
Ответ на: комментарий от qnikst

Ну так я и использую Aeson, но она хороша для простых json-ов, а у меня до 5 ти уровней вложенности может доходит с разными json-типами.

Просто с другими либами я вообще завис, а тут хоть продвинулся.

P.S: Спасибо за наводку на yaml, прикольная вещь, надо будет взять на вооружение.

Sigrlami
() автор топика
Ответ на: комментарий от qnikst

Спасибо, не попадалось, тоже возьму на вооружение.

Sigrlami
() автор топика
Ответ на: комментарий от Sigrlami

наводку на yaml

А еще можно заембеддить интерпретатор lua и писать крутейшие конфиги на нем. Правда, в hackage биндинги не очень хорошие, зато с API для конфигов.

Ну и интерпретатор Схемы никто не отменял. ;)

Macil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.