2016-09-22 2 views
1

In meinem Programm, erstelle ich eine Liste von Zahlen:Haskell - Array Schreiben ohne eckige Klammern Datei

data = [2,3,2,5,2,7,2,3,2,11 ... ] 

Jetzt mag ich in einem diese Liste von Zahlen als einzeilige kommagetrennte Zeichenfolge schreiben Datei. Ich weiß, ich writeFile kombiniert mit Show verwenden:

writeFile "data.txt" $ show $ data 

Dies wird jedoch auch die eckigen Klammern am Anfang und Ende drucken. Jetzt konnte ich die ersten und letzten Zeichen aus der Zeichenkette Show data mit reverse entfernen, aber das ist ineffizient. Irgendwann durchläuft das Programm bereits die Liste, um die Zeichen in die Datei zu schreiben. Wie kann ich also sicherstellen, dass es nicht die ersten und letzten Zeichen schreibt, ohne eine unnötige Traversierung durchzuführen?

Wird dies die Aufgabe am effizientesten erledigen?

writeFile "data.txt" $ drop 1 $ takeWhile (\c -> c/= ']') $ show data 

Antwort

3

Was Sie haben, ist in Ordnung, aber ich denke, dass eine ordentliche Art und Weise ist nicht show auf der Liste zu verwenden, aber jedes Element zu zeigen und in den Kommas selbst setzen, wie folgen aus:

writeFile "data.txt" . intercalate "," . map show $ [1, 2, 3] 

intercalate ist von Data.List.

(übrigens: Sie eine Variable data nicht nennen kann, denn das ist ein Schlüsselwort ist)

+0

Recht sind Sie über die 'data'. Daran hatte ich beim Schreiben des Pseudocodes nicht gedacht. – Myridium

2

Sie haben viele Art und Weise, dies zu tun! Ihre Daten werden in Strings umgewandelt, und Sie sie jetzt verwenden können:

In Ihrem Fall, können Sie Ihren Code wie diesen schreiben kann (jedes Element der Liste wird einmal gelesen und direkt umgewandelt)

writeFile "data.txt" $ Data.List.foldl (\x y -> x ++ show y ++ ",") "" data 

und ohne letztes Komma:

writeFile "data.txt" $ Data.List.tail $ Data.List.foldl (\x y -> x ++ "," ++ show y) "" data 

oder mit intercalate von Data.List

Data.List.intercalate "," $ Data.List.map (\x -> show x) data 

ähnliche Fragen sind auf Stackoverflow:

+1

Schön. Beachten Sie, dass der Fold-Ansatz ein nachkommendes Komma erzeugt, während Intercalate dies nicht tut. – chi

+0

Ja, sorry, Lösung hier: 'Data.List.tail $ Data.List.foldl (\ xy -> x ++", "++ show y)" "Daten". –

+2

'foldl' ist hier eine schlechte Wahl. Probieren Sie es in Ghci auf '[1..1000000]' und beobachten Sie es kriechen. Sie erzwingen '(++)', um mit der linken Seite zu assoziieren, und das macht es quadratische Arbeit, die wiederholt "1" 'dann' "1,2" 'then' "1,2,3" 'usw. verwendet 'fold'. –

Verwandte Themen