2016-10-05 105 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加入。我猜你正在使用binary-0.8.3.0,可能來自Stackage或Haskell平臺。

要使用最新的二進制版本,第一步是在cabal文件中添加一個下限。例如:

...

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

這是說,你要至少版本0.8.4.0(所以你可以使用getFloatle)和至多版本0.8.something(所以你免受未來突破0.9系列可能引入的變化)。如果您不關心未來變化的保護,您也可以省略&& < 0.9

如果您正在使用此更新的cabal文件編譯cabal的代碼,cabal應該爲您下載並安裝binary的適當版本。

+0

我剛剛安裝了使用cabal的二進制包的0.8.4.1版本,似乎都工作正常。在我的開發和測試完成後爲我的包創建cabal文件時,將添加build-depends。現在編譯與ghc,所以我不認爲這支持構建依賴功能。 – Vlam

相關問題