2017-05-12 7 views
1

Hey, ich bin gerade dabei, mit Haskell zu beginnen und ich versuche ein Programm zu schreiben, das ein Eingabewort durch Lesen einer TXT-Datei mit einigen Übersetzungen übersetzt . Davor habe ich ein Programm geschrieben, mit dem ein Benutzer Übersetzungen erstellen kann.Haskell, versucht ein Eingabewort aus einem gegebenen Wörterbuch zu übersetzen

import System.IO 

main :: IO() 
main = do 
    putStrLn "Type in an english word" 
    d <- getLine 
    if null d 
     then return() 
     else do 
      putStrLn "Type in a german translation" 
      b <- getLine 
      putStrLn (d ++ " means in german " ++ b) 
      appendFile "woerterbuch.txt" (", " ++ d ++ " " ++ b) 
      main 

So, jetzt habe ich die Datei woerterbuch.txt bekam, in dem ich die Englisch und Deutsch Wörter wie diese aufgelistet haben: Hello Hallo, Haus Haus, ect. Was ich versuche jetzt zu tun ist, diese Worte in Tupeln zu bekommen, damit ich das zweite (Deutsch) Wort, wenn der Benutzer tippt in einem Englisch Wort drucken.

import System.IO 

    main :: IO() 
    main = do 
     putStrLn "Type in an english word" 
     d <- getLine 
     [contents] <- readFile "woerterbuch.txt" 
     if d `elem` [contents] 
      then do 
      print contents 
      else do 
        putStrLn "There's no translation available!" 

Dies ist, was ich mit nach mehreren Versuchen habe kommen, ich verstehe, dass elem für Listen ist, so brauche ich eine Alternative für meine .txt-Datei und dann versuchen, das zweite Wort des Tupels lösche mit der snd Befehl. Also erstens, wie kann ich die Eingabe der Übersetzungen als Tupel erstellen und zweitens, wie kann ich testen, ob das gewünschte Wort in dieser Liste ist und dann das zweite Element des Tupels ausdrucken, zu dem es gehört? Jede Hilfe würde sehr geschätzt werden.

Antwort

1

verstehe ich, dass Elem für Listen ist, damit ich eine alternative

brauchen Sie Map.fromList verwenden, um einen ausgewogenen Baum Wörterbuch erstellen - Data.Map. Insbesondere

import qualified Data.Map as Map 

main = do 
    contents <- readFile "woerterbuch.txt" 
    let ls = lines contents 
    let ws = fmap words ls 
    let m = Map.fromList [(t!!0, t!!1) | t <- ws, length t == 2]   
    ... 

können Sie m als Wörterbuch verwenden.

+0

Danke, aber ich bekomme die Ausnahme, dass der Index zu groß ist, wenn ich versuche, ein Wort zu übersetzen. "*** Ausnahme: Prelude. !!: index too large" Ich habe Ihren Code wahrscheinlich nicht richtig implementiert, an welcher Stelle sollte ich ihn setzen? und gibt es vielleicht einen Weg, es mit Tupeln zu tun, also brauche ich nicht die !! Index? –

+2

Oh, es liest eine Zeile, die kein Tupel enthält (vielleicht die Endzeile). Ich werde aktualisieren. –

+1

@ J.Tmr Siehe Aktualisierung. –

Verwandte Themen