تكرار إجراءات 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]
ليس لدي مشكلة في القيام بواحدة تلو الأخرى، حيث تنتقل عملية الإدخال/الإخراج إلى حلقة التنفيذ ثم أفعل ما أحتاج إليه باستخدام وظائف خالصة.لا أفهم حقًا كيفية القيام بذلك بطريقة متكررة، ما أبحث عنه أساسًا هو:
-- | 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، لكنني لا أفهم كيف يعمل كل هذا عند تكرار إجراء IO.
المحلول
إذا كنت تريد تكرار نفس الشيء IO
الإجراء على قائمة الأشياء، ثم يمكنك استخدامها mapM
.نوع التوقيع هو (متخصص هنا ل IO
)
mapM :: (a -> IO b) -> [a] -> IO [b]
استخدامه مع الخاص بك getVerbPage
سيعني أن a
متغير النوع هو String
و ال b
متغير النوع هو [Tag String]
.ثم سيكون لديك mapM getVerbPage :: [String] -> IO [[Tag String]]
, ، وهو ما تريده كتعريف getVerbPages
.