Haskell:使用输入值进行过滤和排序

时间:2012-01-10 15:33:51

标签: list sorting haskell input filter

所以我正在创建一个程序,它将选择两个库中的一个(audio.lhs或video.lhs)并返回一个pdf,其中列表按照给定的类别排序和过滤:

mymain = do {putStrLn "What do you wanna search, Video or Audio?";  
          tipo <- getLine;   
          if tipo == "Audio"  
          then do {  
          a <- readFile "audio.lhs" ;  
          let text = splitEvery 7 (splitRegex (mkRegex "\t") a)  
              list = map musicFile text  
              select = filter ((>1000) .size) list  
              orderList = sortBy (comparing title)   
              dir = Dir orderList  
              hs =    "import Dir\nimport TeX\nimport System.Cmd"  
                   ++ "\ntoTeX= do { writeFile \"out.tex\" $ prettyprint dat ;"  
                   ++ "system \"pdflatex out\"}"  
                   ++ "\ndat="  
                   ++ show dir  
          in do { writeFile "dat.hs" hs ;  
                  putStrLn "\nOk.\nNow load \'dat.hs\' and run \'toTeX\'\n"  
                }}...  

一切都在运行,但现在我需要这些功能

select = filter ((>1000) .size) list

orderList = sortBy (comparing title)

而不是使用我给出的值,我希望它们使用程序用户选择的值(输入),所以如果他想要过滤> 2000或<500的文件是他的选择,与类别,大小或标题或其他事物相同。

我的数据结构是

data File = File {
 filename :: String ,
 size :: Int ,
 filetype :: String ,
 copyright :: String ,
 title :: String ,
 artist :: String ,
 year :: String } deriving Show  

musicFile :: [String] -> File  
musicFile [name, size, tipo, copy, title, artist, year] = File name (read size) tipo copy title artist year

任何帮助都会很高兴。

提前致谢。

1 个答案:

答案 0 :(得分:2)

Haskell中用于解析字符串的最简单机制是Read typeclass。此类的实例具有足够的功能来实现

read   :: (Read a) => String -> a
readLn :: (Read a) => IO a

其中任何一项都足以让您开始从输入中读取IntRead的实例)。