尝试理解处理IO
内可能出现的失败模式。如果只有像下面这样的一个case
,那么这可能是可以接受的,但如果嵌套了一堆嵌套的IO (Either String Int)
,是否有一种常见的模式来处理这些类型呢?例如,如果functionDoSomething
中的b
再次是一个(Either a b)
,并且在成功获取值并再次执行某些操作时会出现另一个类似的case
。是否有高阶函数可以使用?我对单子变换器还不熟悉,不确定它们是否可以用于处理此特定的单子堆栈。如果它们可以在这里使用,是否有一种方法可以在不使用它们的情况下完成。
import Control.Monad
functionCreate :: Int -> IO (Either String Int)
functionDoSomething :: Int -> IO b
functionUse :: IO ()
functionUse = do
created <- functionCreate 10
case created of
(Right v) -> void $ functionDoSomething v
_ -> return ()
IO (Either String ())
也就是ExceptT String IO ()
,对吗? - chepnerExceptT
向一侧前进,而runExceptT
向另一侧前进。 - Mark SeemannExceptT
是一个newtype
,所以从某种意义上说你是对的。 - Mark Seemann