Haskell에서 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]
한 번에 하나씩 수행하면 문제가 없습니다. 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
.
제휴하지 않습니다 StackOverflow