2015-07-22 10 views
6

मैंने पढ़ा है और लगातार स्मृति में बहुत सारे ints लिखने के लिए कोशिश कर रहा हूँ में बाइनरी डेटा लिखने के लिए। मैं पता लगा है कि कैसे याद करने के लिए ints लिखने के लिए लेकिन पता लगा नहीं है कि कैसे उन्हें वापस पढ़ने के लिए।पाइपों का उपयोग करना पढ़ें और हास्केल

import Control.Lens (zoom) 
import System.IO (IOMode(..), withFile) 
import Pipes 
import qualified Pipes.Prelude as P 
import qualified Pipes.ByteString as PB  
import qualified Pipes.Parse as P 
import qualified Pipes.Binary as P 

intStream :: Monad m => Proxy x' x() Int m b 
intStream = go (0 :: Int) where 
    go i = yield i >> go (i + 1) 

decoder :: Monad m => Int -> P.Parser P.ByteString m [Int] 
decoder n = zoom (P.decoded . P.splitAt n) P.drawAll 

main :: IO() 
main = do 
    withFile "ints" WriteMode $ \h -> do 
     runEffect $ for intStream P.encode >-> P.take 10000 >-> PB.toHandle h 
    withFile "ints" ReadMode $ \h -> do 
     xs <- P.evalStateT (decoder 10000000) (PB.fromHandle h) 
     print xs 

मैं Pipes.Binary के लिए दस्तावेज़ से डिकोडर समारोह मिला है। हालांकि यह drawAll जो documentationdrawAll के अनुसार पाइप्स की मुहावरेदार उपयोग नहीं है और परीक्षण प्रयोजनों के लिए प्रदान की जाती है का उपयोग करता है।

मेरा प्रश्न कैसे decoder संशोधित करने के लिए इतना है कि यह drawAll का उपयोग नहीं करता है और इस तरह स्मृति में xs के सभी मानों लोड नहीं करता है। तो बजाय XS की सूची मुद्रण की मैं P.map print डीकोड ints की एक धारा से अधिक फ़ाइल से पढ़ा जा रहा सकता है।

उत्तर

6

दस्तावेज़ कहते हैं कि decoded बाइट्स की धारा से डीकोडेड मानों की धारा में एक लेंस है। हम lens से पूर्व view का उपयोग कर के बाद बाहर निकल सकते हैं:

decoder :: Monad m => Int -> Producer P.ByteString m a -> Producer Int m() 
decoder n p = void (view P.decoded p) >-> P.take n 

main :: IO() 
main = do 
    withFile "ints" WriteMode $ \h -> do 
     runEffect $ for intStream P.encode >-> P.take 10000 >-> PB.toHandle h 
    withFile "ints" ReadMode $ \h -> do 
     runEffect $ decoder 10000 (PB.fromHandle h) >-> P.print 

मैं pipes का अधिक अनुभव नहीं है, मैं सिर्फ प्रकार यहाँ का पालन किया। कार्यक्रम के रूप में यद्यपि इरादा ढंग से काम करने लगता है।

+0

मैं प्रकार पालन करने की कोशिश, लेकिन कभी कभी यह मुश्किल हो जाता है जब प्रकार वर्णमाला सूप की तरह तलाश शुरू;) –

संबंधित मुद्दे