2016-10-05 5 views
1

私は似たようなコードを使っていますが、getWord8とgetWord32leを使用しているので、なぜgetFloatleがエラーを出すのですか?次のエラーの取得なぜ変数はスコープに含まれていませんか?

import qualified Data.ByteString.Lazy as BS 
import Data.Word 
import Data.Bits 
import Data.Binary.Get 

readfloat :: BS.ByteString -> Int -> Float 
readfloat contents startpos = runGet getFloatle (BS.drop (fromIntegral startpos) contents) 

main :: IO() 
main = do 
    let myfile = "DATA.BIN" 
    contents <- BS.readFile myfile 
    let stuff = readfloat contents 1042346125 
    print stuff 

test2.hs:7:38: error: 
    Variable not in scope: getFloatle :: Get Float 
+0

類似のコードを表示できますか? – Sibi

+0

バイナリパッケージのどのバージョンをお持ちですか? 'getFloatle'と友人は[最新の](https://hackage.haskell.org/package/binary-0.8.4.1/docs/Data-Binary-Get.html)にありますが、無作為に選ばれた[0.8。 1.0](https://hackage.haskell.org/package/binary-0.8.1.0/docs/Data-Binary-Get.html)。 – gspr

+0

最新のものと思われるhttps://haskell.org/platform/download/8.0.1/haskell-platform-8.0.1-unknown-posix--full-x86_64.tar.gzを使用してインストールしました。 Cabalはバイナリパッケージで0.8.3.0を示しています。 – Vlam

答えて

4

getFloatleはバイナリ0.8.4.0で追加されました。おそらく、StackageやHaskellのプラットフォームからバイナリ-0.8.3.0を使っていると思います。

最新のバイナリバージョンを使用するには、最初にキャバルファイルに下限を設定します。たとえば:

...

build-depends: 
    ..., 
    binary >= 0.8.4.0 && < 0.9, 
    ... 
... 

これは、少なくともバージョン0.8.4.0(あなたがgetFloatleを使用することができます)、ほとんどのバージョン0.8.somethingで(そう、あなたが将来的に保護しているが欲しいと言っています0.9シリーズで導入された可能性があります)。また、将来の変更に対する保護について気にしない場合は、&& < 0.9を省略することもできます。

この更新されたファイルでcabalを使用してコードをコンパイルする場合は、適切なバージョンのbinaryをダウンロードしてインストールする必要があります。

+0

私はcabalを使ってバイナリパッケージの0.8.4.1バージョンをインストールしましたが、すべて正常に動作しているようです。開発とテストが完了した後、私のパッケージ用のカバールファイルを作成するときにbuild-dependsを追加します。今はghcでコンパイルしているので、ビルド依存の機能をサポートしているとは思えません。 – Vlam

関連する問題