2017-04-21 4 views
1

리스트 이해력에서 매트릭스를 만들고 싶습니다. 각 행에 대해 getLine 및 구문 분석이 필요합니다.리스트 이해 내에서 GetLine

간단히 말해서, 나는 이와 같은 것을하고 싶습니다. 나는이 기능 대신에 각 행에 대해 명령 프롬프트에서의 getline에 노력을 실행하면

fun = [ getLine | y <- [0..4]] 

, 나는 '인쇄'의 사용으로 인해 발생 없음 인스턴스 (쇼 (IO 문자열))에 대한 오류가 발생합니다.

오류 메시지가 표시되지만 목록 이해 내에서 어떻게 얻을 수 있습니까?

+0

목록 이해에서'getLine'을 사용했을뿐입니다. P – immibis

+0

그래, 실제로 목록 이해력을 사용하여 빌드 할 매트릭스에 대한 좌표를 얻을 수 있습니다. – mac10688

답변

7

당신이 작업 목록을하려는 경우는 순서대로 각각 평가하고, 각 결과 반환 - [IO a] -> IO [a]을 -이 sequence가있다 :

fun = sequence [getLine | y <- [0..4]] 

이이 Control.Monad.replicateM 단순화 할 수 있습니다

fun = replicateM 5 getLine 
+0

시퀀스는 매트릭스 셀을 좌표로 바꾸기 위해 인덱스를 추적해야하기 때문에 트릭을 수행합니다. 감사!! – mac10688

+1

@ mac10688 그런 경우'mapM'이나'forM'과 같은 유용한 함수를 찾을 수 있습니다. 예를 들어,'fun = forM [0..4] $ \ y -> do {print y; getLine}' – ephemient