Haskell: фильтруйте и сортируйте, используя входные значения - PullRequest
0 голосов
/ 10 января 2012

, поэтому я создаю программу, которая выберет одну из двух библиотек (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, он выбирает и то же самое с категорией, размером или названием или другой вещью. </p>

Моя структура данных

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 Ответ

2 голосов
/ 10 января 2012

Простейшим механизмом синтаксического анализа строк в Haskell является Read класс типов .Экземпляры этого класса обладают достаточной функциональностью для реализации

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

, чего должно быть достаточно, чтобы вы начали читать Int (который является экземпляром Read) из ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...