2013-04-20 13 views
6

Perché lo Data.Binary.Get non è pigro come dice? O sto facendo qualcosa di sbagliato qui?Binario pigro 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 

Questa funzione principale si blocca invece di stampare 10 parole.

+0

La documentazione si è collegato dice: "Questo decoder ha il lato negativo che avrà bisogno di leggere tutti gli input prima di poter tornare" –

+0

@MikhailGlushenkov Beh, in effetti, come mi sono perso. Grazie :) – swish

risposta

4

La documentazione collegata fornisce diversi esempi. Il primo deve leggere tutti gli input prima che possa tornare e assomigli molto a quello che hai scritto. Il secondo è un sinistro e elabora l'input in modo streaming. Ecco il codice riscritto in questo stile:

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 

Testing:

*Main> :main 
[1,1,1,1,1,1,1,1,1,1]