2010-02-07 38 views
4

的墊料的功能我有返回類型ErrorT String IO()的函數。在功能正常的情況下,liftIO的每一行都會產生IO。它使一團糟。有什麼辦法可以解決這個問題,並且仍然有能力在錯誤中中止嗎?Haskell的liftIO的類型ErrorT字符串IO()

回答

5

我認爲this is the context of the question,所以我會重新發布的評論我離開那裏的情況下,你沒有注意到它:如果你使用一些特定功能的很多

,你可以寫一個包裝在他們身邊,例如liftedPutStr = liftIO . putStr。如果您願意,您甚至可以導入合格的原件並使您的升降版本使用相同的名稱。另外,一組不會產生錯誤的IO操作可以被拉出到一個單獨的函數中,然後只需要一次。這有幫助嗎?

如果你不熟悉的合格的進口,在這裏再次putStr的爲例:

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

putStr x = liftIO $ P.putStr x 

這應該讓你使用改變putStr在轉化IO以同樣的方式,你會正常使用真putStr in plain IO

+0

謝謝。我知道我可以定義隱藏liftIO的附加功能,但我認爲沒有一種視覺上更清潔的方式來做到這一點 - 這種或那種方式我必須使這些類型適合。 – me2 2010-02-07 07:37:00

+0

沒有別的,我知道。爲了保持重要的代碼清晰可見,我的建議是在一個單獨的模塊中編寫一堆提升包裝並導入它。還有一堆垃圾代碼,但至少你不必在大多數時間看它!我真的很驚訝,一個圖書館不存在將標準庫'IO'操作提升到'MonadIO'類型類中,但我只是剔除了hackage,並沒有看到任何似乎這樣做的東西。 – 2010-02-07 15:01:01