簡単に言うと、私のコードはaesonを使用して json ファイルを解析することです
ここに私の2つのコードがあります:
a.hs
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as C
import Control.Monad
import Control.Applicative
data AuctionInfo = AuctionInfo {
realm :: Realm ,
alliance :: Auctions ,
horde :: Auctions ,
neutral :: Auctions
} deriving (Show )
instance FromJSON AuctionInfo where
parseJSON (Object o) = do
r <- o .: "realm" >>= parseJSON
a <- o .: "alliance" >>= parseJSON
h <- o .: "horde" >>= parseJSON
n <- o .: "neutral" >>= parseJSON
return $ AuctionInfo r a h n
parseJSON _ = mzero
data Realm = Realm { name2 :: String , slug:: String} deriving (Show )
instance FromJSON Realm where
parseJSON (Object o) = Realm <$>
o .: "name" <*>
o .: "slug"
parseJSON _ = mzero
data Auctions = Auctions {auctions :: [Auc]} deriving (Show)
instance FromJSON Auctions where
parseJSON (Object o ) = Auctions <$> o.: "auctions"
parseJSON _ = mzero
data Auc = Auc {
auc :: Integer,
itme :: Int,
owner :: String,
bid :: Integer,
buyout ::Integer,
quantity :: Int,
timeLeft :: String,
rand :: Integer,
seed :: Integer
} deriving (Show )
instance FromJSON Auc where
parseJSON (Object o ) = Auc <$>
o .: "auc" <*>
o .: "item" <*>
o .: "owner" <*>
o .: "bid" <*>
o .: "buyout" <*>
o .: "quantity" <*>
o .: "timeLeft" <*>
o .: "rand" <*>
o .: "seed"
parseJSON _ = mzero
main = do
au<- C.readFile "a.json"
let x = decode au :: Maybe AuctionInfo
case x of
Just a -> do
{-putStrLn.show $ a-}
putStrLn .show.length.auctions.alliance $ a
putStrLn "ok"
Nothing -> putStrLn "fail"
そしてテスト手順:
- コードを保存し、a.hs (または任意の名前) という名前を付けます。
- テスト データを保存し、a.json という名前を付けます (名前は変更しないでください)。
- インストールしていない場合は
aeson
、$ cabal install aseon
$ ghc a.hs -o a
$ ./a
出力から得られるのは「失敗」です。
そして、コマンド$ runghc a.hs
を数回実行すると、いくつかok
といくつかfail
が混ざり合っていました。
Linux と 64 ビット Mac ghc でもこのコードを試してみましたが、すべてok
期待どおりに出力されました。
私の友人の 1 人も、彼の 32 ビット mac ghc でこのコードを試しましたfail
。そして、彼は私のコードに黒魔術をかけて、1行を次のように変更したと私に言いました
let x = decode $(C.pack. C.unpack) au :: Maybe AuctionInfo
出力はok
です。しかし、同じ黒魔術を行ったとき、出力はまだfail
.
これが私のバグなのか、ghcのバグなのか、どうすればそれを判断できるのかを確認したいだけです。