3

API から xml を解析し、一部の情報を取り除き、結果を json として出力するモジュールを作成しようとしていますが、出力ステップで問題が発生しました。ショーを印刷すると、正しいデータがそこにあることが確かにわかりますが、レコードをjsonに変換する必要がある呼び出しencode showsにより、セグメンテーション違反が発生します。

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

編集: user1891025 が指摘したように、これは私のマシンまたはパッケージのバージョンに問題がある可能性があります。

  • システム: Ubuntu 11.04 32 ビット
  • エイソン v0.6.1.0
  • GHC v7.2.1

この質問はますます具体的になってきているので、irc に持っていきますが、誰か助けがあれば教えてください!

4

1 に答える 1

0

パッケージからのAeson のencode関数呼び出し。その関数は、およびその他の安全でない関数を使用して、メモリ内をいじります。それはおそらくセグメンテーション違反が発生する場所です。encodeUtf8Data.TextunsafeDupablePerformIO

こちらのコードを参照してください。

于 2013-05-08T19:41:13.523 に答える