gpt4 book ai didi

haskell - 这是 MAC 上 32 位 GHC 的错误吗

转载 作者:行者123 更新时间:2023-12-02 13:02:22 25 4
gpt4 key购买 nike

长话短说,我的代码是使用 aeson 解析 json 文件。

这是我的两段代码:

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"

我的json test file

以及测试步骤:

  1. 保存代码,并将其命名为 a.hs(或您想要的名称)
  2. 保存测试数据,命名为a.json(不要更改名称)
  3. 如果您尚未安装aeson$ cabal install aseon
  4. $ ghc a.hs -o a
  5. $ ./a

我从输出中得到的是“失败”。

当我运行命令 $ runghc a.hs 几次时,我什至将一些ok和一些fail混合在一起。

我还在我的 linux 和 64 位 mac ghc 上尝试过这段代码,它们都按照我的预期输出 ok

我的一个 friend 也在他的 32 位 mac ghc 上尝试过这段代码,失败。他告诉我,他对我的代码施了一些黑魔法,将一行更改为

 let x = decode $(C.pack. C.unpack) au :: Maybe AuctionInfo

然后输出是ok。但是当我执行同样的黑魔法时,输出仍然是失败

我只是想确定这是我的错误还是 ghc 的错误,或者我如何确定。

最佳答案

我不确定该行为是否与此相关,但您绝对不应该使用 Data.ByteString.Lazy.Char8 因为这仅适用于 8 位 ASCII 数据,并且您的输入是UTF-8。

尝试用

替换该导入
import qualified Data.ByteString.Lazy as BL

并使用BL.readFile读入数据(当然实际名称并不重要,但是BL是惰性字节串包的惯用简写) .

请注意,通常您会使用 Data.Text 来处理 unicode 文本,但在这种情况下,aeson API 需要二进制文件(即 ByteString >) 表示并在内部处理 unicode 解码。

编辑:实际上,现在我已经对此进行了更多思考,我认为问题不在于使用 Char8 (尽管重点在于不将其用于 unicode 文本)一般),因为您没有从 StringChar 进行任何转换(除了 C.pack . C.unpack 实验,这会破坏所有多字节字符)。

关于haskell - 这是 MAC 上 32 位 GHC 的错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16351731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com