Haskell 这是MAC上32位GHC的错误吗

Haskell 这是MAC上32位GHC的错误吗,haskell,ghc,Haskell,Ghc,为了缩短long stroy,我的代码是关于使用 以下是我的两段代码: a、 hs {-#语言重载字符串} 导入数据.Aeson 将限定数据.ByteString.Lazy.Char8作为C导入 进口管制 导入控制 数据拍卖信息=拍卖信息{ 领域::领域, 联盟:拍卖, 部落:拍卖, 中立:拍卖 }派生(显示) 来自JSON AuctionInfo的实例,其中 parseJSON(对象o)=do r>=parseJSON a>=parseJSON h>=parseJSON n>=parseJSO

为了缩短long stroy,我的代码是关于使用

以下是我的两段代码:

a、 hs

{-#语言重载字符串}
导入数据.Aeson
将限定数据.ByteString.Lazy.Char8作为C导入
进口管制
导入控制
数据拍卖信息=拍卖信息{
领域::领域,
联盟:拍卖,
部落:拍卖,
中立:拍卖
}派生(显示)
来自JSON AuctionInfo的实例,其中
parseJSON(对象o)=do
r>=parseJSON
a>=parseJSON
h>=parseJSON
n>=parseJSON
返回$AuctionInfo r a h n
parseJSON=mzero
数据领域=领域{name2::String,slug::String}派生(显示)
来自JSON领域的实例,其中
parseJSON(对象o)=领域
o.:“姓名”
o.:“鼻涕虫”
parseJSON=mzero
数据拍卖=拍卖{拍卖::[Auc]}衍生(显示)
实例,其中
parseJSON(对象o)=拍卖o.:“拍卖”
parseJSON=mzero
数据Auc=Auc{
auc::整数,
itme::Int,
所有者::字符串,
bid::整数,
买断::整数,
数量:Int,
timeLeft::String,
兰德:整数,
种子::整数
}派生(显示)
来自JSON Auc的实例,其中
parseJSON(对象o)=Auc
o.:“auc”
o.:“项目”
o.:“所有者”
o.:“投标”
o.:“收购”
o.:“数量”
o.:“时间限制”
o.:“兰德”
o.:“种子”
parseJSON=mzero
main=do
奥多
{-putStrLn.show$a-}
putStrLn.show.length.auctions.alliance$a
“好的”
Nothing->putStrLn“失败”
我的

和测试步骤:

  • 保存代码,并将其命名为a.hs(或您想要的名称)
  • 保存测试数据,将其命名为a.json(不要更改其名称)
  • 如果您尚未安装aeson,请安装aseon
  • $ghc a.hs-o a
  • $。/a
  • 我从输出中得到的是“失败”

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

    我也在我的linux和64位mac ghc上试过这段代码,它们都像我预期的那样输出
    ok

    我的一个朋友也在他的32位mac ghc上尝试过这个代码,
    fail
    。他告诉我,他对我的代码施了一些魔法,把一行改成了一行

    让x=decode$(C.pack.C.unpack)au::也许是拍卖信息
    
    然后输出为
    ok
    。但当我使用同样的黑魔法时,输出仍然是
    fail


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

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

    尝试将该导入替换为

    import qualified Data.ByteString.Lazy as BL
    
    并使用
    BL.readFile
    读取数据(当然,实际名称并不重要,但
    BL
    是惰性bytestring包的惯用缩写)

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


    编辑:事实上,现在我已经仔细考虑了这一点,我不认为问题在于使用
    Char8
    毕竟(尽管重点是一般情况下不将其用于unicode文本),因为您没有从
    String
    Char
    进行任何转换(除了
    C.pack.C.unpack
    实验,该实验将打破所有多字节字符).

    您的测试文件中有一些Unicode,这在Linux下不是问题,但谁知道其他操作系统。我在Windows上的GHC中看到了一些令人讨厌的Unicode相关错误。您是否尝试过在ASCII数据上进行测试?很难确定这是否是Unicode的错误。我尝试过从测试数据中删除一行,将其他行保留为Chinese字符,然后获得
    OK