HASKELL : "Map Putstrln"을 사용할 수 없습니까?
문제
문자열 목록이 있고 이것을 시도했습니다.
ls = [ "banana", "mango", "orange" ]
main = do
map PutStrLn list_of_strings
그것은 효과가 없었고 왜 그런지 이해할 수 없습니다.
ghc print-list.hs
print-list.hs:3:0:
Couldn't match expected type `IO t' against inferred type `[IO ()]'
In the expression: main
When checking the type of the function `main'
힌트가 있습니까? 맵이 값이 아닌 목록을 반환하는 것과 관련이 있다고 생각하지만이 문제를 해결하는 쉬운 방법을 찾지 못했습니다.
지금 내가 문자열 목록을 인쇄하는 유일한 방법은 각 요소를 인쇄하고 (목록이 [A] 인 경우 인쇄하지만 (A : B) 인 경우 인쇄하고 재발하는 함수를 작성하는 것입니다. 그러나 그것은 될 것입니다 많이 맵 만 사용하는 것이 더 간단합니다 ...
감사!
해결책
유형 main
기능이 있어야합니다 IO t
(어디 t
유형 변수입니다). 유형 map putStrLn ls
~이다 [IO ()]
. 이것이이 오류 메시지를받는 이유입니다. 다음을 실행하여 직접 확인할 수 있습니다. ghci
:
Prelude> :type map putStrLn ls
map putStrLn ls :: [IO ()]
문제에 대한 한 가지 해결책은 사용하는 것입니다 mapM
, 이것은 "모나디아"버전입니다 map
. 또는 사용할 수 있습니다 mapM_
그것은 동일합니다 mapM
그러나 반환 된 값을 함수에서 수집하지 않습니다. 당신은 반환 값을 신경 쓰지 않기 때문에 putStrLn
, 사용하는 것이 더 적절합니다 mapM_
여기. mapM_
다음 유형이 있습니다.
mapM_ :: Monad m => (a -> m b) -> [a] -> m ()
사용 방법은 다음과 같습니다.
ls = [ "banana", "mango", "orange" ]
main = mapM_ putStrLn ls
다른 팁
Ayman의 대답은이 상황에서 가장 의미가 있습니다. 일반적으로, 당신이 있다면 [m ()]
그리고 당신은 원합니다 m ()
, 그런 다음 사용하십시오 sequence_
, 어디 m
모든 모나드가 될 수 있습니다 IO
.
제휴하지 않습니다 StackOverflow