我是一个学习Haskell的新人,我想写一个小电话簿程序。我把联系人列表放在一个名为phone.txt的文件中 喜欢:
("xie","123")
("bob","234")
我的节目是:
import System.IO
main = do
handle <- openFile "phone.txt" ReadMode
contents <- hGetContents handle
name<-getLine
putStrLn $ [findNumber name contents]
findNumber x [] = "not found"
findNumber x ((y,z):ys) = if x==y then z else findNumber x ys
这个程序用于通过输入名称来查找数字,为什么我不能编译它? 这有什么不对?
答案 0 :(得分:1)
你几乎就在那里......这是我的解决方案(未针对性能进行优化):
import System.IO
main = do
handle <- openFile "phone.txt" ReadMode
contents <- hGetContents handle
let phonebook = map readEntry $ lines contents
name<-getLine
putStrLn $ findNumber name phonebook
where readEntry line = read line :: (String,String)
findNumber x [] = "not found"
findNumber x ((y,z):ys) = if x==y then z else findNumber x ys
继续享受Haskell的乐趣:)
答案 1 :(得分:1)
findNumber
具有以下类型:
findNumber :: Eq a => a -> [(a, [Char])] -> [Char]
但是,findNumber name contents
中的第二个参数的类型为String
,而不是[(a, [Char])
。您需要正确解释从hGetContents
获得的字符串:
toDict :: String -> [(String, String)]
toDict = map read . lines
之后您可以在toDict contents
中搜索:
putStrLn . findNumber name $ toDict contents