首页 > 解决方案 > 如何从 IO Monad 调用 Handler Monad 中的函数

问题描述

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

我有两个类型的功能

funA :: String -> IO ()
funB :: String -> Handler (Either a b)

有什么办法可以从 funA 内部调用 funB ,诸如此类

  res <- funB
   case res of ...

不改变 funA 的类型。

我不太清楚 monad 的 run 函数是做什么的,但是我在其他一些库中使用它来达到这个效果,但是对于 Yesod,runHandler 方法仅供内部使用。它是否有其他方法用于同一任务?

标签: haskellyesod

解决方案


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

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

因此,这使您能够Handler aIO a.

因此,您可以像这样运行您的函数:

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

推荐阅读