gpt4 book ai didi

Haskell:处理 IO 内部故障的常见模式::IO (Either String Int)

转载 作者:行者123 更新时间:2023-12-03 21:22:37 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How do I deal with many levels of indentation?

(3 个回答)


3年前关闭。




试图了解用于处理内部可能出现的故障的模式 IO .如果它只是一个 case如下所示,它可能是可以接受的,但如果嵌套继续一堆嵌套 IO (Either String Int) s 是否有处理此类类型的通用模式。例如,如果 bfunctionDoSomething又是 (Either a b)获取成功的值(value)并再次用它做某事将是另一个这样的 case .是否有我可以使用的高阶函数?我对 monad 转换器还不满意,不确定它们是否可以用来处理这个特定的 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 ()

最佳答案

我知道您是 Haskell 的新手,并且 monad 转换器不是您想要解决的第一个概念。然而,在这种情况下,它是要使用的模式。

可以这么说,Monads 通常使您能够“织入和织出仿函数”。如果你只有 Either ,您可以使用 Either值与 do拉动 Right 的符号值中的值,同时将 Left 短路案件。

但是,在这种情况下,您有一堆 monad:Either内部 IO .因此,当您尝试使用 do 时符号,你在 IO上下文,这意味着,正如 OP 所示,您使用 <- 从函数中“拉出”的值箭,还在Either值。

Monad 转换器使您能够将成堆的 monad(例如,在本例中 Either 内的值 IO)视为 Monad实例,这样你就可以,例如,使用 do堆栈上的符号。

虽然您期望 Either要调用的 monad 转换器 EitherT ,出于各种原因,它被称为 ExceptT .您可以像这样稍微简化 OP 代码:

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

在这里, createdInt值,然后可以传递给 functionDoSomething .

关于Haskell:处理 IO 内部故障的常见模式::IO (Either String Int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52016330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com