2012-01-10 3 views
0

, поэтому я создаю программу, которая выберет одну из двух библиотек (audio.lhs или video.lhs) и вернет pdf-файл со списком, упорядоченным и отфильтрованным по данной категории:Haskell: фильтр и сортировка с использованием входных значений

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) 

вместо ш orking со значениями, которые заданы мной, я хочу, чтобы они работали со значениями, выбранными пользователем программы (входы), поэтому, если он хочет фильтровать файлы размером> 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

Вы уже используете пользовательский ввод с 'getLine'. Как это отличается от того, что вы хотите сделать сейчас? Что вы пробовали? –

+0

Я пробовал использовать 'getLine', но он не поймет, когда я дам ему Integer, плюс, когда я использую переменную, которая будет иметь фильтр значений' getLine' и сравните сбой, потому что это не то, чего они ждут – seph

+2

. мы делаем пару программ здесь :-) Вы задали четыре вопроса об этой программе за последние два дня. Я не уверен, что Stack Overflow подходит для этого - может быть, вместо этого использовать IRC-канал [Haskell IRC] (http://www.haskell.org/haskellwiki/IRC_channel)? –

ответ

2

Самый простой механизм, доступный в Haskell для синтаксических строк, - Read typeclass. Экземпляры этого класса имеют достаточно функций для реализации

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

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

+0

эй Даниил, о чтении Integer я вышел с 'GetInt :: IO Int' ' GetInt = readLn' проблема в ">" или "<" – seph

+2

@seph Для учебника с использованием IO (и другие другие монады), выберите одну из превосходных должностей sigfpe: [IO Monad для людей, которые просто не заботятся] (http://blog.sigfpe.com/2007/11/io-monad-for-people -who-simply-dont.html) или [Вы могли бы изобретать монады (и, возможно, у вас уже есть)] (http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and .html). –

+0

спасибо, я посмотрю. – seph

Смежные вопросы