2012-08-30 9 views
1

Quand je teste ma fonction intervalFinder en GHCi il semble fonctionner, mais lorsque je tente de le compiler, je ne sortie:Lazy ByteString comportement étrange ou bug?

La fonction fonctionne sur l'entrée:

*Main> intervalFinder $[B.pack"first",B.pack"second",B.empty,B.pack"third",B.emp 
ty] 
Loading package bytestring-0.9.2.1 ... linking ... done. 
["Start Time: first","End Time: second","Start Time: third","End Time: third 
"] 

Et en cours d'exécution principale:

*Main> main 
Loading package bytestring-0.9.2.1 ... linking ... done. 
*Main> :q 
Leaving GHCi. 

impressions en results.txt:

Start Time: firstEnd Time: secondStart Time: thirdEnd Time: third 

mais si je lance ghc test3.hs, le fichier de sortie est 0kb (et évidemment pas de données dedans!)

Est-ce que je fais quelque chose de mal?

code:

{-# LANGUAGE OverloadedStrings #-} 
import qualified Data.ByteString.Char8 as B 
import qualified Data.ByteString.Lazy.Char8 as Bl 
import System.IO 
import System.Environment 


intervalFinder :: [B.ByteString]->[B.ByteString] 
intervalFinder x = helper x "" 
    where 
    helper (x:xs) "" 
     | x /= "" = ((B.append (B.pack("Start Time: ")) x)):(helper xs x) 
     | otherwise = helper xs "" 
    helper (x:xs) y 
     | x == "" = ((B.append (B.pack("End Time: ")) y)):(helper xs "") 
     | otherwise = helper xs x 
    helper _ _  = [] 

main = do 
    filehandle <- openFile "result.txt" WriteMode 
    Bl.hPutStr (filehandle) . Bl.fromChunks . intervalFinder $[B.pack"first",B.pack"second",B.empty,B.pack"third",B.empty] 

Merci!

Répondre

3
main = do 
    filehandle <- openFile "result.txt" WriteMode 
    Bl.hPutStr (filehandle) . Bl.fromChunks . intervalFinder 
      $[B.pack"first",B.pack"second",B.empty,B.pack"third",B.empty] 

La sortie est tamponnée, de sorte que le programme se termine sans vidage du tampon avec runghc ou avec un binaire compilé. En ghci, tous les tampons sont vidés lorsque ghci est quitté¹.

Lorsque vous openFile un handle de fichier, vous devez hClose après utilisation. Cela vide également le tampon de sortie s'il est ouvert en mode écriture ou ajout.

main = do 
    filehandle <- openFile "result.txt" WriteMode 
    Bl.hPutStr (filehandle) . Bl.fromChunks . intervalFinder 
      $[B.pack"first",B.pack"second",B.empty,B.pack"third",B.empty] 
    hClose filehandle 

Vous pouvez également utiliser writeFile

main = Bl.writeFile "result.txt" $ Bl.fromChunks ... 

¹ Je ne suis pas sûr à 100%, mais l'expérience le soutient.

+0

Cela a fait l'affaire! J'étais coincé parce qu'avant d'insérer inverfalFinder, le code fonctionnait bien (j'avais une carte (Bl.pack.Blackpack) en place) et je n'arrivais pas à comprendre pourquoi l'un fonctionnait et l'autre non. – MdxBhmt

+1

Le code 'hClose' est dangereux (peut laisser fuir le handle en cas d'exceptions). C'est ce que 'withFile' est pour. – Peaker