为什么Data.Binary.Get不像它所说的那样懒惰?还是我在这里做错了什么?
import Data.ByteString.Lazy (pack)
import Data.Binary.Get (runGet, isEmpty, getWord8)
getWords = do
empty <- isEmpty
if empty
then return []
else do
w <- getWord8
ws <- getWords
return $ w:ws
main = print $ take 10 $ runGet getWords $ pack $ repeat 1
该主要功能只是挂起,而不是打印10个单词。
最佳答案
您链接的文档提供了几个示例。第一个需要阅读所有输入后才能返回,并且看起来很像您编写的内容。第二个是左键折叠,以流方式处理输入。这是用这种样式重写的代码:
module Main where
import Data.Word (Word8)
import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get (runGetState, getWord8)
getWords :: BL.ByteString -> [Word8]
getWords input
| BL.null input = []
| otherwise =
let (w, rest, _) = runGetState getWord8 input 0
in w : getWords rest
main :: IO ()
main = print . take 10 . getWords . BL.pack . repeat $ 1
测试:
*Main> :main
[1,1,1,1,1,1,1,1,1,1]
关于haskell - 懒二进制获取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16119184/