www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

r2p2

Gepostet:
19.08.2009 20:32

Probleme mit Laziness und Monaden  
Hallo,

ich versuche gerade hinter Monaden zu kommen und stolpere dabei über folgendes Problemchen.


import System.IO
import Data.ByteString as BS

main = do
let path = "/tmp/example"
file_handle ← openFile path ReadMode
msg ← read_file file_handle []
print (Prelude.take 2 msg)
print "fin"

read_file :: Handle → IO [ByteString]
read_file handle = do
eof_reached ← hIsEOF handle
if eof_reached
then return []
else do
current_line ← BS.hGetLine handle
print current_line
next_line ← read_file handle
return (current_line : next_line)


Ziel ist es eine CSV-Datei auszulesen, Zeilenumbrüche in Listen zu verwandeln und dann irgendwas damit zu tun.
Wenn ich in die Datei 3 Zeilen eintrage greift das take 2 zwar nur 2 Listeneinträge heraus, das print current_line verrät aber, dass er auch die letzte Zeile auswertet.
Wie müssen Funktionen aufgebaut sein um die Laziness von ByteString weiter zu reichen?

Grüße
r2
Zum Seitenanfang    
 
Siracusa

Gepostet:
22.08.2009 00:32

   
Hallo,

es gibt die ByteString-Variante Data.ByteString.Lazy, die Chunks lazy aus der Datei liest. Allerdings ist dort die Funktion hGetLine nicht implementiert, du bekommst immer nur 64K-Blöcke lazy gelesen. Du müsstest also mittels hGetContents den Dateiinhalt lesen und dann mit den "normalen" Listenfunktionen aus ByteString selbst die Zeilen aufspalten.


Viele Grüße,

Siracusa
Zum Seitenanfang