2014-02-24 4 views
9

Ich versuche, einen einfachen Json-Parser in meinem Haskell-Code zu installieren. Ich stieß auf Data .Aeson schien wie eine tragfähige Lösung für mein ProblemDer erwartete Typ 'Data.ByteString.Lazy.Internal.ByteString' konnte nicht mit dem tatsächlichen Typ '[Char]' verglichen werden.

ich die example code on the page folgte, und mit einigen kleineren Modifikationen, hier ist, was ich habe:

{-#LANGUAGE OverloadedStrings #-} 

import Data.Aeson 
import Data.Text 
import Control.Applicative 
import Control.Monad 

data Person = 
    Person { firstName :: Text 
      , lastName :: Text 
      , age  :: Int 
      } deriving Show 

instance FromJSON Person where 
    parseJSON (Object v) = 
     Person <$> v .: "f_name" 
       <*> v .: "l_name" 
       <*> v .: "age" 
    parseJSON _ = mzero 

Ausführen des folgenden in GHCi die böse Nachricht im Titel führt erscheinen:

decode "{\"f_name\":\"Haskell\", \"l_name\":\"Curry\",\"age\":114}" :: Maybe Person 

Also, hat jemand hier eine Idee, was schief gelaufen ist? Ich folgte dem Beispielcode fast genau so, wie er geschrieben wurde, also warum scheitert es?

+0

'decode' erwartet einen' ByteString' und Sie haben ein normales String-Literal (Typ von '[Char]') angegeben. Sehen Sie http://hackage.haskell.org/package/bytestring –

+0

das Beispiel folgte ich verwendet eine normale Zeichenfolge ... Sie würden das Beispiel auf hackage.haskell.org wird richtig geschrieben ... –

+5

Sie müssen wahrscheinlich tun ': setze -XOverloadedStrings' in GHCi vor dem Aufruf von' decode'. – fjh

Antwort

23

Bevor Sie decode in ghci aufrufen, müssen Sie :set -XOverloadedStrings eingeben, damit das String-Literal als ByteString anstelle von String behandelt wird. Das Pragma im Modul gilt nur für den Code im Modul, nicht für das, was Sie in ghci tun.