Ошибка компиляции Aeson Generics с ручной функцией parseJSON

#json #haskell #aeson

#json #хаскелл #эсон

Вопрос:

Я создал свою собственную функцию parseJSON для своего типа оценки. К сожалению, я получаю ошибки компиляции из-за отсутствия «общей» версии Valuation, и я не уверен, что с этим делать. Я прочитал и перечитал столько руководств aeson, сколько смог, и, похоже, ни в одном из них это не упоминается. Я сделал свой тип оценки экземпляром класса FromJSON и предоставил собственную реализацию функции parseJSON, но по какой-то причине компилятор, похоже, думает, что это реализация другой функции parseJSON , и я не знаю, почему или как это исправить. Любая помощь была бы очень признательна.

C:UsersJohnGitHubhaskell_projectslearningsrcLib.hs:17:10 : ошибка: * Нет экземпляра для (GHC.Generics.Общая оценка), возникающая в результате использования aeson-0.11.2.1:Data.Aeson.Types.Class.$dmparseJSON'
* In the expression:
aeson-0.11.2.1:Data.Aeson.Types.Class.$dmparseJSON
In an equation for
parseJSON’: parseJSON = aeson-0.11.2.1:Данные.Эсон.Типы.Class.$ dmparseJSON В объявлении экземпляра для `оценки FromJSON»

— При обучении сборке пакета -0.1.0.0 с использованием: C:UsersJohnAppDataRoamingstacksetup-exe-cachex86_64-windowssetup-Simple-Cabal-1.24.0.0-ghc-8.0.1.exe —builddir=.stack-workdist b7fec021 библиотека сборки: learning exe:learning-exe —ghc-options Процесс » -ddump-hi-ddump-to-file» завершен с кодом: ошибка выхода 1

Вот код:

 {-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{- The DuplicateRecordFields language extension allows records to use the same name for field labels. Without it, all the records in this module would need to have unique names for all their fields.
-}
module Lib
    ( someFunc,
    ) where
import Data.Time.Calendar

import Control.Lens
import Data.Aeson.Lens (_String, _Object, key)
import Network.Wreq
import Data.Aeson (Value(..), FromJSON, (.:), (.=), withObject)

data Valuation = Valuation {valued_on :: Day, price :: Double}

instance FromJSON Valuation where
parseJSON = withObject "valuation" $ o -> do
    query <- o .: "query"
    results <- query .: "results"
    quote <- results .: "quote"
    price <- quote .: "Open"
    return Valuation{valued_on=today, price=price}
 

Комментарии:

1. Есть ли вероятность, что вы не сделали отступ parseJSON и его тело дальше, чем строка с instance FromJSON Valuation where ? Если это так, то сообщение об ошибке будет иметь смысл, поскольку подпись по умолчанию parseJSON полагается на Generic

2. Я перепроверил, и моя догадка оказалась верной: вам просто нужно сделать отступ parseJSON и его тело дальше. Кроме того, вам необходимо импортировать методы FromJSON too, добавив a (..) после FromJSON в инструкции import . Наконец, у вас проблема, потому что нет такой функции, как today :: Day .

3. Вау. Большое вам за это спасибо. Вы были абсолютно правы. Я сделал отступ в функции parseJSON, и это отсортировало ошибку компиляции. Я забыл вставить функцию today.

4. Как помощник для других, идущих тем же путем. Мне также нужно было изменить импорт из JSON на: импорт данных. Aeson (Значение(..), изjson(..), (.:), (.=), С объектом) Без этого изменения я получаю следующую ошибку: parseJSON' is not a (visible) method of class FromJSON’

5. Что ж, спасибо @torrlane — мне, по-видимому, нужно ToJSON (..)