2016-04-22 12 views
0

Ich habe ein Problem mit dem folgenden Code. Es soll eine Art Wörterbuch sein, das zuerst nach einem deutschen Wort sucht, dann nach einem bayerischen Wort und beides in einer .txt-Datei speichert. Dann neLine für das nächste Paar. Das Programm wird beendet, wenn Sie keine neuen Wörter mehr eingeben. UPDATE: Die neue Zeile "/ n" funktioniert nicht. Wie kann ich das lösen?Haskell newline, wie?

main :: IO() 
main = do 
    putStrLn "Deutsches Wort: " 
    deutsch <-getLine 
    if deutsch /= [] 
    then do 
    putStrLn "Bayerisches Wort: " 
    bayerisch <- getLine 
    appendFile "woerterbuch.txt" (deutsch++ " "++ bayerisch++ " /n") 
    putStrLn (deutsch ++ " ist auf bayerisch " ++ bayerisch) 
    main 
    else return() 
+1

Servus Mauritius. Ihre Einrückung ist ... gemischt. Können Sie bitte sicherstellen, dass der Code tatsächlich mit dem Ihres Systems übereinstimmt? Auch 'writeFile' _always_ schneidet Dateien ab. Außerdem sollte 'bayerisch/n' nicht funktionieren. – Zeta

+0

hat die Einrückung geändert. so offensichtlich habe ich die writeFile-funktion missverstanden. Wie kann ich mein Programm ändern, um ein Paar von zwei Wörtern in einer TXT-Datei und danach Newline zu speichern? – Mauritius

+2

Die Funktion 'isNotEmpty' kann vereinfacht werden. Du machst im Grunde "wenn Bedingung dann wahr, sonst falsch". –

Antwort

3

Hier ist, wie ich es tun würde.

import System.IO 
import System.Environment 
import Control.Monad 

main :: IO() 
main = do 
    (fileName:_) <- getArgs 
    unless (null fileName) $ 
    withFile fileName WriteMode makeDictionary 
    where  
    makeDictionary :: Handle -> IO() 
    makeDictionary h = do 
     putStrLn "Deutsches Wort: " 
     deutsch <-getLine 
     if not . null $ deutsch 
     then do 
      hPutStr h $ deutsch++" " 
      putStrLn "Bayerisches Wort: " 
      bayerisch <- getLine 
      hPutStrLn h bayerisch 
      putStrLn (deutsch ++ " ist auf bayerisch " ++ bayerisch) 
      makeDictionary h 
     else return() 

Ihre überarbeitete Version sieht aus wie es sollte funktionieren, aber die Vorteile dabei ist, dass die Datei nicht wiederholt geöffnet und geschlossen wird. Obwohl ich nicht sicher bin, ob GHC intelligent genug ist, um es in Ihrem Fall offen zu halten. Außerdem ist es im Allgemeinen besser, nach leeren Strings mit null zu suchen, anstatt mit einer leeren Liste zu vergleichen.

Bearbeitet per Chepner's Kommentar.

+0

danke für diese Version! Weißt du auch, wie ich die Datei, in der es gespeichert werden sollte, als Argument angeben kann, wenn Sie es in der Shell ausführen? Ich versuchte es mit args <- getArgs, aber es funktioniert nicht – Mauritius

+1

Edited, um einen Dateinamen zu akzeptieren. Aber Achtung, dies wird abstürzen, wenn kein Argument übergeben wird, aber alle Argumente nach dem ersten ignorieren. –

+1

Ich würde überprüfen, ob 'deutsch' null ist, bevor Sie es in die Datei schreiben. – chepner