我正在Yesod中构建Web应用程序。
我有两种类型的功能
funA :: String -> IO ()
funB :: String -> Handler (Either a b)
有什么方法可以从funA内部调用funB?
res <- funB
case res of ...
不更改funA的类型。
我不清楚monad的run函数有什么作用,但是我已经在其他一些库中使用了它来达到这种效果,但是对于Yesod来说,runHandler方法仅用于内部使用。相同的任务?
答案 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 -> ...