Учу Haskell и мне нужна маааленькая помощь

 
0
 
Functional languages
ava
afiskon | 30.05.2011, 16:06
Сразу скажу, что вопрос ламерский и из серии "помогите найти ошибку". Вот мой код:

import Network.Curl.Download
import Text.Regex.PCRE
import System

-- преобразование ссылки на видео в ссылку на XML
urlToXmlUrl :: String -> String -- TODO: Maybe String ?
urlToXmlUrl url =
  let regex = "^(?:http://)?rutube\\.ru/.*?[\\?&]{1}v=([a-f\\d]{32})"
      match = url =~ regex :: [[String]]
  in case match of
    [] -> ""
    [[_, hash]] -> "http://bl.rutube.ru/" ++ hash ++ ".xml"  

-- проверяем количество аргументов и выводим usage если
-- число аргументов неверно
parseArgs :: [String] -> IO ()
parseArgs (url:outFile:xs) = do
  putStrLn $ "Url = " ++ url

  let xmlUrl = urlToXmlUrl url in
    putStrLn $ "XmlUrl = "  ++ xmlUrl
--    xmlData <- openURI xmlUrl
--    putStrLn $ "xmlData = " ++ xmlData
--    putStrLn $ "length(xmlData) " ++ ( length xmlData )

--  rtmpUrl <- xmlUrlToRtmlUrl xmlUrl
--  putStrLn $ "RtmpUrl = " ++ rtmpUrl

parseArgs _ = do
  progName <- getProgName
  putStrLn $ "Usage: " ++ progName ++ " <url> <outfile>"
  exitWith $ ExitFailure 1

main = do
  args <- getArgs
  parseArgs args


Мне не ясно две вещи. Первая - как указать флаг /i в регулярном выражении? Вторая - что написать в parseArgs, чтобы определить xmlUrl = urlToXmlUrl url (я ведь могу вызвать чистую функцию из монады, чтобы она считалась "лениво"?), затем скачать данные (xmlData <- openURI xmlUrl), потом вывести результат, потом подать его на вход какой-то другой функции. Не до конца я видимо с синтаксисом разобрался.

Заранее спасибо.
Comments (2)
ava
afiskon | 31.05.2011, 12:14 #
Кажется, допер

test =
  let message = "Hello, world!\n" in do
    putStrLn message

main = do
  test


А флаги в регулярных выражениях, кажется, ставятся так:

Regex "....." flags e
ava
Void | 31.05.2011, 12:39 #
let внутри do-нотации использовать очень просто. Собственно, вся do-нотация сводится к паре рекурсивных правил, одно из которых:

do                          let x = y in
    let x = y       =>      do
    z                           z

С регулярками, к сожалению, так сразу помочь не могу, в Text.Regex.Base типы несколько наворочены.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Void   afiskon
advanced
Submit