2013-04-20 11 views
6

Warum ist Data.Binary.Get nicht faul wie es sagt? Oder mache ich hier etwas falsch?Faule binäre erhalten

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 

Diese Hauptfunktion hängt nur statt 10 Wörter zu drucken.

+0

Die Dokumentation, die Sie verknüpft sagt: „Dieser Decoder den Nachteil hat, dass sie benötigen alle Eingaben zu lesen, bevor sie zurückkehren können“ –

+0

@MichailGlushenkov Nun, in der Tat, wie habe ich das vermisst. Vielen Dank :) – swish

Antwort

4

Die von Ihnen verlinkte Dokumentation enthält mehrere Beispiele. Der erste muss alle Eingaben lesen, bevor er zurückkehren kann, und sieht sehr ähnlich aus, was Sie geschrieben haben. Die zweite ist eine linke Falte und verarbeitet die Eingabe in einer Streaming-Weise. Hier ist der Code in diesem Stil neu geschrieben:

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]