2013-01-06 3 views
6

나는 목록을 출력하는 장기 실행 계산이 있습니다. 이 목록에서 계산 된 값을 출력하고 싶습니다. 이것을하기위한 깔끔한 방법은 무엇입니까?목록에서 계산 된 값을 어떻게 출력해야합니까?

현재 각 값을 STDOUT으로 인쇄하려면 mapM_ print을 사용합니다. 이것은 명령 행에 값을 인쇄하는 단순한 경우에는 충분하지만 hacky와 함께 작업하기가 힘듭니다.

또한 어떤 시점에서 커맨드 라인 출력을 대화 형 시각화로 바꾸고 싶습니다. 내 목록을 FRP의 이벤트 스트림과 같은 것으로 바꾸려면 어떻게해야합니까? 이것을 기존 GUI 프레임 워크에 이벤트 소스로 연결할 수 있다는 점은 훌륭 할 것입니다.

목록 이외의 것을 사용하는 기능을 다시 작성하는 것은 옵션이지만, 목록을있는 그대로 사용하는 것이 이상적입니다.

+0

하스켈의 목록은 게으르고'mapM_'도 잘 동작하므로, 기본 해결책은 상당히 좋습니다. 'hFlush stdout'을 사용하여 출력이 실제로 플러시되는지 확인하십시오 (예 :'mapM_ (hFlush stdout << print')). –

답변

6

이것은 라이브러리와 같은 iteratees 및 iteratees의 작업입니다.

Proxy 라이브러리 사용

import Control.Proxy 

runProxy $ fromListS [1..10] >-> <processing> >-> printD >-> <more> processing> 

여기에서 <processing>은 필요한 추가 계산입니다.

비슷한 질문 : lazy version of mapM, 예를 들어 Is Haskell's mapM not lazy?

:

> labeledPrint label x = putStrLn $ label ++ show x 
> runProxy $ fromListS [1..4] >-> printD >-> mapD (*2) 
           >-> useD (labeledPrint "Second printer: ") 
1 
Second printer: 2 
2 
Second printer: 4 
3 
Second printer: 6 
4 
Second printer: 8 

당신이 응용 프로그램의 순서를 반대로하고 <-< 대신 >->를 사용하는 경우는 정상 기능을 응용 프로그램처럼 보인다.

+1

당신은'mapMD'를 변경하고 싶지 않으면'mapMD' 대신'useD'를 사용할 수 있습니다. 값이 아래쪽으로 흐른다. –

+1

그것은 좋은 생각이므로 위에 적용했다. – Davorak

관련 문제