2012-05-19 56 views
0

我正试图重写一个从一个或多个网页中抓取信息并将其转换为闪存卡的小程序。小片段在这里:Haskell中的IO操作的复现

-- | this takes a string and produces IO [Tag String] 
getVerbePage x = fmap parseTags $ openURL $ "http://leconjugueur.lefigaro.fr/conjugaison/verbe/" ++ x ++ ".html" 

main = do 
    tags <- getVerbePage "aller" 
    -- | from here I do whatever I like with a clean [Tag String] 

在一段时间我都没有问题做一个,在IO转到做循环,然后我做什么,我需要与纯函数。我真的不知道如何在经常性的方式做到这一点,基本上就是我后:

-- | this takes a string and produces IO [Tag String] 
getVerbePage x = fmap parseTags $ openURL $ "http://leconjugueur.lefigaro.fr/conjugaison/verbe/" ++ x ++ ".html" 

main = do 
    verbsString <- getLine -- | example input "aller pouvoir" 
    let verbs = splitOn " " verbsString -- | list of strings 
    pages <- getVerbePages verbs 
    -- | from here use pure functions on pages, which would be type [[Tag String]] 

getVerbePages :: [String] -> [[Tag String]] -- | I guess. 
getVerbePages ps = ?????? 

的问题是我怎么写了在PS中每个字符串getVerbePages循环和清洁退货吗?我已经能够做到递归动作以及所有到目前为止的好处,非常适合Haskell newb,但我不明白在重复执行IO动作时所有这些都是如何工作的。

回答

4

如果你想重复同一个IO行动的事情列表,那么你可以使用mapM。它的类型签名(这里专门用来IO

mapM :: (a -> IO b) -> [a] -> IO [b] 

getVerbPage使用这将意味着a型变量Stringb类型变量是[Tag String]。那么你应该有mapM getVerbPage :: [String] -> IO [[Tag String]],这就是你想要的getVerbPages的定义。

+1

干杯,这就是我一直在寻找的东西,在我的初学者书中还没有达到,只是去追赶它。 'getAllPages VS = MAPM getVerbePage vs' 'getVerbePage X = FMAP parseTags $的OpenURL $ “http://leconjugueur.lefigaro.fr/conjugaison/verbe/” ++ X ++名 “.html”' 由于一堆。 – MalucoMarinero