2017-04-08 78 views
0

我一直在關注在Haskell樣本地址簿程序:如何實現搜索在Haskell

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" 

當前可用的功能只是添加和打印條目。我如何實現這個搜索功能?假設我在提示中輸入「name」和「ronaldo」,它將只顯示名爲ronaldo的條目。

順便說一句,哪裏是代碼或容器,其中包含數據(名稱,電話和電子郵件),我可以應用過濾器或elem函數?

謝謝。

回答

1

addrs包含通過搜索的地址。

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

謝謝。順便說一句,我得到的錯誤addressbook.hs:36:12:錯誤: 變量不在範圍內:isInfixOf ::() - >字符串 - > Bool – pgtr3s

+0

讓我爲你鎬這:https://www.haskell.org/hoogle /?hoogle = isInfixOf – fredefox

+0

明白了。需要導入Data.List和單詞< - getLine是我的作品 – pgtr3s