1

Aeson を使用したこのサンプル プログラムの場合:

module Main where

import Data.Maybe
import Data.Aeson
import Data.Map as Map
import Data.Functor
import qualified Data.ByteString.Lazy as LBS

main = do
  jsonContent <- LBS.readFile "templates/test.json"
  print (decode jsonContent :: Maybe TemplateConfig)

newtype TemplateConfig = TemplateConfig (Map String String)
                         deriving Show

instance FromJSON TemplateConfig where
         parseJSON val = TemplateConfig <$> parseJSON val

インスタンスが見つからないというエラーが表示されます。

$ ghc test.hs
[1 of 1] Compiling Main             ( test.hs, test.o )

test.hs:17:45:
    No instance for (FromJSON (Map String String))
      arising from a use of `parseJSON'
    Possible fix:
      add an instance declaration for (FromJSON (Map String String))
    In the second argument of `(<$>)', namely `parseJSON val'
    In the expression: TemplateConfig <$> parseJSON val
    In an equation for `parseJSON':
        parseJSON val = TemplateConfig <$> parseJSON val

JSON を解析するには FromJSON インスタンスが必要であり、Aeson には一般的に使用される多くのインスタンスが含まれていることも理解しています。ドキュメントによると、インスタンスがありFromJSON v => FromJSON (Map String v)、この場合はそれを使用する必要があると思いました。

私は何が欠けていますか?

4

1 に答える 1

1

2011 年 2 月にリリースされたバージョン 0.2 以降、aesonFromJSON v => FromJSON (Map String v)にインスタンスがありました。これは、バージョン 0.1にはありませんでした。したがって、古いバージョンの aeson がインストールされていると思いますが、これはおそらく上限のある依存関係として取り込まれたものです。

于 2013-10-16T19:41:04.717 に答える