2013-10-16 57 views
1

在這個例子中PROGRAMM使用埃宋:爲什麼(Map String v)的現有FromJSON實例沒有在(Map String String)上使用?

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 

我明白我需要一個FromJSON實例解析JSON,也有很多Aeson中常用的實例。根據documentation有一個例子FromJSON v => FromJSON (Map String v),我認爲它應該在這種情況下使用。

我錯過了什麼?

+1

這就是我的系統上工作正常 – Satvik

+0

嗯。 #haskell上的人也有這個代碼工作。我在ghc 7.4.2上使用aeson-0.6.2.1。我想我會嘗試一個乾淨的設置cabal和檢查回來。 –

+1

對於GHC 7.6.3而言,aeson 0.6.1.0並不適用於我。 – bheklilr

回答

1

aeson since version 0.2中的FromJSON v => FromJSON (Map String v)實例已於2011年2月發佈。version 0.1中缺少該實例。所以我想你已經安裝了一個老版本的aeson,它可能被作爲依賴的上界引入。

+0

我正在使用aeson-0.6.2.1。這是我檢查的第一件事情之一。這一定是我的集體環境的一個問題。新設置後,它的工作原理,所以我想別的東西一定會導致它不正常。 –

相關問題