문제

문자열 목록이 있고 이것을 시도했습니다.

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top