Haskell:处理IO::IO内部故障的通用模式(字符串或Int)
试图了解用于处理Haskell:处理IO::IO内部故障的通用模式(字符串或Int),haskell,monads,Haskell,Monads,试图了解用于处理IO中可能出现的故障的模式。如果它只有一个cases(如下所示),那么它可能是可以接受的,但是如果嵌套的IO(String Int)s是一个处理此类类型的通用模式。例如,如果functionDoSomething中的b再次是a(a b),那么获取成功的价值并再次使用它做一些事情将是另一种情况。是否有我可以使用的高阶函数?我还不习惯使用monad transformers,不确定它们是否可以用来处理这个特定的monad堆栈。如果它们可以在这里使用,有没有一种不用它们的方法呢 imp
IO
中可能出现的故障的模式。如果它只有一个case
s(如下所示),那么它可能是可以接受的,但是如果嵌套的IO(String Int)
s是一个处理此类类型的通用模式。例如,如果functionDoSomething
中的b
再次是a(a b)
,那么获取成功的价值并再次使用它做一些事情将是另一种情况。是否有我可以使用的高阶函数?我还不习惯使用monad transformers,不确定它们是否可以用来处理这个特定的monad堆栈。如果它们可以在这里使用,有没有一种不用它们的方法呢
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 ()
import-Control.Monad
functionCreate::Int->IO(字符串或Int)
functionDoSomething::Int->IO b
functionUse::IO()
functionUse=do
已创建void$functionDoSomething v
_->返回()
我知道你是哈斯克尔的新手,monad transformers并不是你想要解决的第一个概念。然而,在这种情况下,这是要使用的模式
可以说,单子通常可以让你“在函子中穿插穿插”。如果您只有other
,您可以使用other
值和do
符号将右侧
值从值中拉出,同时短路左侧
案例
然而,在本例中,您有一个单子的“堆栈”:或者在IO
内部。因此,当您尝试使用do
表示法时,您处于IO
上下文中,这意味着,如OP所示,您使用IO(任一字符串())
从函数中“拉出”的值也是字符串IO()
,对吗?@chepner它们是两种不同的类型,但它们是同构的ExceptT
是单向的,而runExceptT
是反向的。@chepnerExceptT
是一种newtype
,所以从某种意义上说你是对的。啊,是的,我明白了。
import Control.Monad (void)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Except
functionUse :: IO (Either String ())
functionUse = runExceptT $ do
created <- ExceptT $ functionCreate 10
liftIO $ void $ functionDoSomething created