Haskell:如何像列表一样生成文件

时间:2014-02-08 15:23:01

标签: haskell

我是一个学习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

这个程序用于通过输入名称来查找数字,为什么我不能编译它? 这有什么不对?

2 个答案:

答案 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