6

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 ワードを出力する代わりにハングします。

4

1 に答える 1

4

リンクしたドキュメントには、いくつかの例が記載されています。最初のものは、返される前にすべての入力を読み取る必要があり、あなたが書いたものとよく似ています。2 つ目は左折で、入力をストリーミング方式で処理します。このスタイルで書き直したコードは次のとおりです。

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]
于 2013-04-20T11:21:04.900 に答える