2017-04-08 2 views
0

ich nach einer Probe Adressbuchs Programm in Haskell habe:Wie in Haskell Suche implementieren

menu = "1.Add address\n2.List addresses\n3.Exit" 
main = do 
    prompt [] 

data Address=Address String String String  
    deriving Show 

prompt :: [Address] -> IO() 
prompt addrs= do 
    putStrLn menu 
    choice <- getLine 
    interpret addrs choice 

interpret :: [Address]->String -> IO() 
interpret addrs "1" = do 
    putStr "Names:" 
    names <- getLine 

    putStr "Phone:" 
    phone <- getLine 

    putStr "Email:" 
    email <- getLine 


    putStrLn "Address added" 
    prompt (addAddr(getAddr names phone email) addrs) 

interpret addrs "2" = do 
    printAddrs addrs 
    prompt addrs 


interpret addrs "3" = putStrLn "Good bye" 
interpret _ _ = putStrLn "Don't know what to do with ya!" 

getAddr ::String->String->String->Address 
getAddr names phone email = Address names phone email 

addAddr::Address->[Address]->[Address] 
addAddr addr addrs = addr:addrs 

printAddrs::[Address]->IO() 
printAddrs addrs= putStrLn (fmtAddresses (tail addrs) (head addrs) "") 

fmtAddresses::[Address]->Address->String->String 
fmtAddresses addrs (Address names phone email) str 
    | (length addrs==0) = currStr 
    | (length addrs /=0) = fmtAddresses (tail addrs) (head addrs) currStr 
    where currStr = str++"Names:"++names++"Phone:"++phone++"Email:"++email++"\n" 

Die aktuellen verfügbaren Funktionen sind nur hinzufügen und Druck Einträge. Wie kann ich dafür eine Suchfunktion implementieren? Lassen Sie uns sagen, wenn ich "Name" und "Ronaldo" in die Eingabeaufforderung einfüge, werden nur Einträge mit dem Namen Ronaldo angezeigt.

Übrigens, wo ist der Code oder Container, der die Daten (Namen, Telefon und E-Mail) enthält, wo ich Filter oder Elem-Funktion anwenden kann?

Danke.

Antwort

1

addrs enthält die zu durchsuchenden Adressen.

interpret addrs "4" = do 
    putStr "Fulltext search keyword:" 
    word <- getLine 
    printAddrs (filter (\(Address name phone email) 
     -> isInfixOf word name 
     || isInfixOf word phone 
     || isInfixOf word email 
    ) addrs) 
    prompt addrs 
+0

Danke. Btw, ich bekomme den Fehler addressbook.hs: 36: 12: Fehler: Variable nicht im Geltungsbereich: isInfixOf ::() -> String -> Bool – pgtr3s

+0

Lassen Sie mich das für Sie hoogle: https://www.haskell.org/hoogle /? hoogle = isInfixOf – fredefox

+0

Verstanden. Zum Importieren von Data benötigt. Liste und Wort <- getLine ist derjenige, der für mich funktioniert – pgtr3s

Verwandte Themen