2012-12-25 4 views
3

J'essaie d'écrire un module qui analyse XML à partir d'une API, supprime certaines informations, et imprime le résultat en JSON, mais j'ai frappé un hoquet à l'étape de l'impression. Si j'imprime des spectacles je vois en effet que les données correctes sont là, cependant, l'appel qui devrait transformer les enregistrements en json, encode shows, produit un segfault.Pourquoi ce code produirait-il un segfault?

{-# LANGUAGE Arrows, NoMonomorphismRestriction, OverloadedStrings #-} 
import Network.HTTP 
import Text.XML.HXT.Core 
import Data.Aeson 
import qualified Data.ByteString.Lazy.Char8 as LazyByteString 

openUrl :: String -> IO String 
openUrl url = getResponseBody =<< simpleHTTP (getRequest url) 

composeSearch :: String -> String 
composeSearch query = "http://services.tvrage.com/feeds/search.php?show=" ++ urlEncode query 

searchShow :: String -> IO String 
searchShow query = openUrl $ composeSearch query 

data TvShow = TvShow { showName, showId :: String } deriving (Show) 

getShow = deep (isElem >>> hasName "show") >>> 
    proc x -> do 
     name <- getText <<< getChildren <<< deep (hasName "name") -< x 
     id <- getText <<< getChildren <<< deep (hasName "showid") -< x 
     returnA -< TvShow { showName = name, showId = id } 

instance ToJSON TvShow where 
    toJSON (TvShow name id) = object ["name" .= name, "id" .= id] 

main :: IO() 
main = do 
    results <- searchShow "Always Sunny" 
    shows <- runX (readString [ withValidate no ] results >>> getShow) 
    putStrLn (LazyByteString.unpack (encode shows)) 

Edit: Comme user1891025 a souligné, cela peut être un problème avec mes versions de la machine ou l'emballage.

  • System: Ubuntu 11.04 32 bits
  • Aeson v0.6.1.0
  • GHC v7.2.1

Cette question devient de plus en plus spécifique, donc je vais le prendre à irc, mais si n'importe qui a de l'aide s'il vous plaît faites le moi savoir!

+1

Ca marche pour moi. Vous pouvez publier vos informations système, les versions de package et les messages d'erreur s'ils existent. – user1891025

+0

Je pense que vous avez raison. J'ai essayé un exemple posté qui utilisait aussi 'encoder 'mais aussi segfaulted. Aeson (vraisemblablement) semble ne pas aimer ma machine. :) –

+0

Quels indicateurs utilisez-vous pour compiler le code? Pourrait être des problèmes avec, par exemple, le backend LLVM sur votre chipset. –

Répondre

0

La fonction encode d'Aeson appelle encodeUtf8 à partir du package Data.Text. Cette fonction utilise unsafeDupablePerformIO et d'autres fonctions dangereuses pour fouiller dans la mémoire. C'est peut-être là où le segfault arrive.

Voir le code here.