gpt4 book ai didi

haskell - 如何组合不同的 Monad Stacks?

转载 作者:行者123 更新时间:2023-12-01 12:41:50 26 4
gpt4 key购买 nike

我有 2 个具有“交叉”接口(interface)的函数:

type Config = (param1, param2)

runExe :: [String] -> ReaderT Config IO ExitCode
someAction :: [String] -> ReaderT Config (MaybeT IO) ()

由于 runExesomeAction 都带有不可变的 Config,我想隐式地传递它,而不是显式地“询问”。类似于以下内容:

 someAction params = monadConvertor runExe ["some" , "params"]

如何实现 monadConvertor

据我了解,monadConvertor 需要提取 IO ExitCode 然后解除 guard (rc == ExitSuccess)。但我不知道这是否可能。

最佳答案

您的 monadConverter 应具有以下类型:

monadConverter :: ReaderT Config IO ExitCode -> ReaderT Config (MaybeT IO) ()

正如您在问题中所写,您只需要“提取”ExitCode,然后“解除”guard (rc == ExitCode),您可以使用 lift 函数。现在的问题是您不能在 ReaderT Config (MaybeT IO) () 中使用 ReaderT Config IO ExitCode。您可以使用 mapReaderT 解决此问题:

mapReaderT :: mapReaderT :: (m a -> n b) -> ReaderT r m a -> ReaderT r n b

使用该函数,monadReader 可以实现如下:

monadConverter :: ReaderT Config IO ExitCode -> ReaderT Config (MaybeT IO) ()
monadConverter action = do
exitCode <- mapReaderT lift action
lift $ guard (exitCode == ExitSuccess)

此处,mapReaderT lift 的类型为 ReaderT Config IO ExitCode -> ReaderT Config (MaybeT IO) ExitCode

关于haskell - 如何组合不同的 Monad Stacks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23711063/

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