4
的墊料的功能我有返回類型ErrorT String IO()
的函數。在功能正常的情況下,liftIO
的每一行都會產生IO。它使一團糟。有什麼辦法可以解決這個問題,並且仍然有能力在錯誤中中止嗎?Haskell的liftIO的類型ErrorT字符串IO()
的墊料的功能我有返回類型ErrorT String IO()
的函數。在功能正常的情況下,liftIO
的每一行都會產生IO。它使一團糟。有什麼辦法可以解決這個問題,並且仍然有能力在錯誤中中止嗎?Haskell的liftIO的類型ErrorT字符串IO()
我認爲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
。
謝謝。我知道我可以定義隱藏liftIO的附加功能,但我認爲沒有一種視覺上更清潔的方式來做到這一點 - 這種或那種方式我必須使這些類型適合。 – me2 2010-02-07 07:37:00
沒有別的,我知道。爲了保持重要的代碼清晰可見,我的建議是在一個單獨的模塊中編寫一堆提升包裝並導入它。還有一堆垃圾代碼,但至少你不必在大多數時間看它!我真的很驚訝,一個圖書館不存在將標準庫'IO'操作提升到'MonadIO'類型類中,但我只是剔除了hackage,並沒有看到任何似乎這樣做的東西。 – 2010-02-07 15:01:01