2017-04-08 79 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