2016-10-05 106 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

相关问题