簡體   English   中英

Haskell中IO操作的重復發生

[英]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類型變量為Stringb類型變量為[Tag String] 然后,您將獲得mapM getVerbPage :: [String] -> IO [[Tag String]] ,這就是您想要的getVerbPages定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM