Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中实现搜索_Haskell_Search_Addressbook - Fatal编程技术网

如何在Haskell中实现搜索

如何在Haskell中实现搜索,haskell,search,addressbook,Haskell,Search,Addressbook,我一直在遵循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 <- g

我一直在遵循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"
menu=“1.添加地址\n2.列出地址\n3.退出”
main=do
提示[]
数据地址=地址字符串
衍生节目
提示::[Address]->IO()
提示addrs=do
putStrLn菜单
选择字符串->IO()
解释地址“1”=do
putStr“名称:”
姓名地址
getAddr names电话电子邮件=地址名称电话电子邮件
地址->[地址]->[地址]
addr addr addrs=addr:addrs
printAddrs::[Address]->IO()
printAddrs addrs=putStrLn(fmtaddress(tail addrs)(head addrs)”)
fmtAddresses::[地址]->地址->字符串->字符串
地址(地址名称电话电子邮件)str
|(长度地址==0)=currStr
|(长度地址/=0)=FMTADRESS(尾部地址)(头部地址)currStr
其中currStr=str++“name:+++name++”Phone:+++Phone++”Email:+++Email++“\n”
当前可用的功能只是添加和打印条目。我如何实现此功能的搜索功能?假设我在提示符中输入“name”和“罗纳尔多”,它将只显示名为罗纳尔多的条目

顺便问一下,保存数据(姓名、电话和电子邮件)的代码或容器在哪里,我可以在那里应用过滤器或elem功能


谢谢。

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
解释地址“4”=do
putStr“全文搜索关键字:”
单词名称的不确定性
||isInfixOf字电话
||isInfixOf word电子邮件
)地址)
提示地址

谢谢。顺便说一句,我得到了错误地址簿。hs:36:12:error:变量不在范围内:isInfixOf::()->String->BoolGot it。需要导入数据。列表和word