سؤال

أحاول إعادة كتابة برنامج صغير يقوم باستخلاص المعلومات من صفحة ويب واحدة أو أكثر ثم يحولها إلى بطاقات فلاش.مقطع صغير هنا:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top