문제

나는 하나 이상의 웹 페이지에서 정보를 긁어낸 다음 이를 플래시 카드로 바꾸는 작은 프로그램을 다시 작성하려고 합니다.여기에 작은 조각이 있습니다.

-- | 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 행동을 반복할 때 이 모든 것이 어떻게 작동하는지 이해하지 못했습니다.

도움이 되었습니까?

해결책

같은 내용을 반복하고 싶다면 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