1

問題を実証するための簡単なプロジェクトを作成しました:https ://github.com/jdevelop/testcabal

'cabal install'を使用してモジュールをコンパイルおよびインストールすると、TestDataをバイナリでシリアル化できません。

> ghci                                               
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
ghci> :m +TestBinary.Test Data.Binary
ghci> randomData  . decode $ encode emptyTest 

<interactive>:1:24:
    No instance for (Binary TTestData)
      arising from a use of `encode'
    Possible fix: add an instance declaration for (Binary TTestData)
    In the second argument of `($)', namely `encode emptyTest'
    In the expression: randomData . decode $ encode emptyTest
    In an equation for `it':
        it = randomData . decode $ encode emptyTest

Test.hsをghciに直接ロードすると、すべてが期待どおりに機能します。

> ghci TestBinary/Test.hs 
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
[1 of 1] Compiling TestBinary.Test  ( TestBinary/Test.hs, interpreted )
Ok, modules loaded: TestBinary.Test.
ghci> randomData  . decode $ encode emptyTest 
Loading package array-0.3.0.2 ... linking ... done.
Loading package bytestring-0.9.1.10 ... linking ... done.
Loading package containers-0.4.0.0 ... linking ... done.
Loading package binary-0.5.1.0 ... linking ... done.
"123456"

Haskellコンパイラのバージョン:

> ghci --version 
The Glorious Glasgow Haskell Compilation System, version 7.0.4
4

1 に答える 1

2

.cabalファイルには、

Build-depends: base < 5, ghc-binary >= 0.5, bytestring >= 0.9.1

通常ghc-binaryは公開されておらず、GHC自体以外での使用を目的としたものではありません。Data.Binaryghciにロードすると、パッケージからモジュールがbinaryロードされ、そのパッケージのクラスはからのクラスとはBinary異なるghc-binaryためTTestData、インスタンスはありません。

ソースからファイルをロードする場合、ghciは.cabalファイルを気にせず、からのクラスをbinary直接使用するため、機能します。

binaryパッケージへの依存関係を変更する必要があります。

于 2012-07-22T18:33:21.777 に答える