0

1 つまたは複数の Web ページから情報をスクレイピングしてフラッシュ カードに変換する小さなプログラムを書き直そうとしています。ここに小さなスニペットがあります:

-- | 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]

一度に 1 つずつ実行しても問題はありません。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 = ??????

問題は、ps の各文字列をループしてきれいに返すように getVerbePages を作成するにはどうすればよいかということです。私はこれまで、再帰的なアクションとそのすべてを問題なく行うことができましたが、これはほとんど Haskell の初心者ですが、IO アクションを繰り返すときにこれらすべてがどのように機能するかを理解していません。

4

1 に答える 1

4

物事のリストに対して同じアクションを繰り返したい場合はIO、 を使用できますmapM。その型シグネチャは (ここでは に特化IO)

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

your でそれを使用すると、型変数がであり、型変数が でgetVerbPageあることを意味します。これは、 の定義として必要なものです。aStringb[Tag String]mapM getVerbPage :: [String] -> IO [[Tag String]]getVerbPages

于 2012-05-19T10:16:45.303 に答える