2014-02-24 1 views
9

간단한 Json 파서를 사용하고 Haskell 코드에서 실행하려고하는데 데이터를 발견했습니다. .Aeson은 내가 example code on the page을 따라 내 문제예상 유형 'Data.ByteString.Lazy.Internal.ByteString'을 실제 유형 '[Char]'과 일치시킬 수 없습니다.

에 대한 실행 가능한 해결책처럼 보였다, 그리고 약간의 수정, 여기에 내가 가진 무엇 :

{-#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 

가 GHCi가 제목에 불쾌한 메시지가 나타납니다에서 다음을 실행 표시 :

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

그래서 여기에있는 사람들이 무엇이 잘못되었는지 생각하고 있습니까? 필자는 예제 코드를 거의 그대로 작성 했으므로 실패한 이유는 무엇입니까?

+0

'decode'는'ByteString'을 기대하고 있으며 보통 문자열 리터럴 ('[Char]'유형)을 부여했습니다. http://hackage.haskell.org/package/bytestring을 보시오. –

+0

내가 사용한 예제는 일반적인 문자열을 사용했습니다. hackage.haskell.org의 예제가 올바르게 작성되었다고 가정합니다 ... –

+5

아마 할 필요가 있습니다. ': set -XOverloadedStrings'을 GHCi에서 사용하기 전에'decode'를 호출하십시오. – fjh

답변

23

ghci에서 decode을 호출하기 전에 :set -XOverloadedStrings을 수행해야하므로 문자열 리터럴은 String이 아닌 ByteString으로 처리됩니다. 모듈의 pragma는 ghci에서 수행하는 작업이 아니라 모듈의 코드에만 적용됩니다.