Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:处理IO::IO内部故障的通用模式(字符串或Int)_Haskell_Monads - Fatal编程技术网

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
是反向的。@chepner
ExceptT
是一种
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