2010-02-07 3 views
4

ErrorT String IO()을 반환하는 함수가 있습니다. 함수가 작동하는 동안 liftIO의 IO는 모든 행을 처리합니다. 그것은 엉망이됩니다. 이 문제를 해결할 수있는 방법이 있습니까? 오류가 발생하면 중단 할 수있는 방법이 있습니까? , 당신이 그들 주위에 래퍼를 쓸 수Haskell의 liftIO의 ErrorT String IOter의 쓰레기 기능

몇 특정 기능을 많이 사용하는 경우 :

답변

5

나는 this is the context of the question 가정, 그래서 댓글이 나는 당신이 그것을 통지하지 않은 경우에 거기 남아 다시 게시 할 수 있습니다 예 liftedPutStr = liftIO . putStr. 원하는 경우 원본을 가져 와서 같은 이름을 사용하는 해제 된 버전으로 만들 수도 있습니다. 또한 오류를 발생시키지 않는 IO 작업 그룹을 liftIO 일 수있는 단일 별도의 기능으로 끌어 올 수 있습니다. 그게 도움이 되니?

import Prelude hiding (putStr) 
import qualified Prelude as P 
import Control.Monad.Trans 

putStr x = liftIO $ P.putStr x 

하면 같은 방법으로 당신이 정상적으로를 사용하는 거라고 당신이 변화 IO의 변경 putStr을 사용할 수 있도록해야합니다

경우

여기 예로 putStr 다시의 자격을 갖춘 수입에 익숙하지 않은 진짜 putStr은 보통 IO입니다.

+0

감사합니다. 나는 liftIO를 숨기는 추가 기능을 정의 할 수 있다는 것을 이해합니다.하지만 시각적으로 더 깔끔한 방법이 없다고 생각합니다. 한 가지 방법이든 다른 방식이든 적용 할 수 있습니다. – me2

+0

내가 알고있는 그 어떤 것도 없습니다. 중요한 코드를 시각적으로 깨끗하게 유지하기 위해서 제 제안은 별도의 모듈에 래퍼를 들어 올려서 가져 오는 것입니다. 아직도 정크 코드의 무리,하지만 적어도 당신은 대부분의 시간을 보지 않아도됩니다! 나는 표준 라이브러리'IO' 액션을'MonadIO' 타입 클래스로 옮기기 위해 라이브러리가 이미 존재하지 않는다는 사실에 놀랐지 만, 단지 hackage를 건너 뛰었고, 그렇게 보이지 않는 것을 보지 못했습니다. –