【发布时间】:2013-12-11 12:48:17
【问题描述】:
所以我有两个文件,内容如下:
File 1:
Tom 965432145
Bill 932121234
File 2:
Steve 923432323
Tom 933232323
我想合并它们并将结果输出写入一个名为“out.txt”的文件。我写了这个函数来处理重复(当同名出现多次时,它会选择进入最终文件的数字)。
该函数被称为选择:
choosing :: [String] −> Int −> Int −> Int
choosing ("Name_of_person":_) num1 _ = num1
choosing _ num1 num2
| num2 ‘div‘ 100000000 == 2 = num2
| otherwise = num1
这是我到目前为止根据提示所做的事情:
我把问题分解成小函数,这样会更容易解决。
import Text.Printf
import Text.Parsec
import Text.Parsec.String
choosing _ num1 num2
| num2 `div` 100000000 == 2 = num2
| otherwise = num1
parseNameNumber :: Parser (String, Integer)
parseNameNumber = do
spaces
name <- many1 letter
space
number <- fmap read $ many1 digit
return (name, number)
parseFile :: String -> IO ()
parseFile = do
result <- parseFromFile (parseNameNumber `sepBy` newline)
case result of
Left err -> print err
Right res -> print res
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
mergeEntries :: [(String, Int)] -> [(String, Int)] -> [(String, Int)]
mergeEntries [] y = y
mergeEntries x [] = x
mergeEntries xl@(x@(xname, xphone):xs) yl@(y@(yname, yphone):ys)
| xname < yname = x : mergeEntries xs yl
| xname == yname = choosing xname x y : mergeEntries xs yl
| xname > yname = y : mergeEntries xs yl
serializeEntries :: [(Int, Char)] -> [Char]
serializeEntries entries = concatMap (uncurry $ printf "%s %d\n") entries
main = do
entries1 <- fmap parseFile $ readFile "in1.txt"
entries2 <- fmap parseFile $ readFile "in2.txt"
writeFile "out.txt" $ serializeEntries $ mergeEntries $ quicksort entries1 quicksort entries2
现在我认为一切都是正确的,除了我的解析函数返回一个 IO() 而不是一个字符串,我该如何改变这个?
【问题讨论】:
-
很抱歉给您带来不便@BartekBanachewicz,我已经改了:)