HaskellのIO行動の再発
質問
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]
.
一つのことをやっています問題なしに、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を書いてきれいに戻すのですか?私は再帰的な行動とこの時点までのすべてのもので大丈夫に行うことができました。
解決
物事のリストを介して同じIO
アクションを繰り返す場合は、mapM
を使用できます。そのタイプの署名は(ここに専門に専門としています)
mapM :: (a -> IO b) -> [a] -> IO [b]
.
IO
で使用すると、getVerbPage
Type変数がa
で、String
Type変数はb
です。その後、[Tag String]
を持つことになります。これはmapM getVerbPage :: [String] -> IO [[Tag String]]
の定義として必要なものです。
所属していません StackOverflow