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

时间:2019-07-18 20:05:03

标签: haskell yesod

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

我有两种类型的功能

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

有什么方法可以从funA内部调用funB?

  res <- funB
   case res of ...

不更改funA的类型。

我不清楚monad的run函数有什么作用,但是我已经在其他一些库中使用了它来达到这种效果,但是对于Yesod来说,runHandler方法仅用于内部使用。相同的任务?

1 个答案:

答案 0 :(得分:3)

如果使用堆栈的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 <- handler (funB parameter)
    case res of
        Left x -> ...
        Right y -> ...