[英]Recurrence of IO Actions in Haskell
我正在嘗試重寫一個小程序,該程序將從一個或多個網頁上抓取信息,然后將其轉換為閃存卡。 這里的小片段:
-- | 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進入do循環,然后我用純函數完成我需要做的事情。 我不太了解如何以重復的方式進行此操作,基本上我所追求的是:
-- | 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 = ??????
問題是如何編寫getVerbePages以遍歷ps中的每個字符串並干凈地返回它? 到目前為止,我已經能夠很好地執行遞歸操作以及所有此類操作,尤其是Haskell newb,但是我不了解重復執行IO操作時這一切如何工作。
如果要對事物列表重復相同的IO
操作,則可以使用mapM
。 其類型簽名為(此處為IO
專用)
mapM :: (a -> IO b) -> [a] -> IO [b]
將其與getVerbPage
一起使用將意味着a
類型變量為String
, b
類型變量為[Tag String]
。 然后,您將獲得mapM getVerbPage :: [String] -> IO [[Tag String]]
,這就是您想要的getVerbPages
定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.