如何从 IO Monad 调用 Handler Monad 中的函数

How to call functions in Handler Monad from IO Monad

我正在 Yesod 中构建 Web 应用程序。

我有两个

类型的函数
funA :: String -> IO ()
funB :: String -> Handler (Either a b)

有什么方法可以从 funA 内部调用 funB 之类的东西

  res <- funB
   case res of ...

不改变 funA 的类型。

我不太清楚 monad 的 运行 功能是做什么的,但我在其他一些库中使用过它来达到这个效果,但是对于 Yesod 来说,运行Handler 方法是为了内部使用 only.Does 它有一些其他方法来完成相同的任务吗?

如果您使用堆栈的 yesod-simple(或朋友)模板,那么默认情况下,该模板将包含一个名为 handler [GitHub]:

的函数
-- | Run a handler
handler :: Handler a -> IO a
handler h = getAppSettings >>= makeFoundation >>= flip unsafeHandler h

因此,这使您能够 运行 Handler a IO a

因此您可以 运行 您的函数,例如:

funA :: String -> IO ()
funA parameter = do
    res <- <b>handler</b> (funB parameter)
    case res of
        Left x -> ...
        Right y -> ...