haskell - 如何从 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 方法仅供内部使用。它是否有其他方法用于同一任务?
解决方案
如果你使用yesod-simple
stack 的(或朋友)模板,那么默认情况下,该模板将包含一个名为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 -> ...
推荐阅读
- python - pd .cut 间隔的令人困惑的结果
- javascript - antd: Select 组件的 'inputValue' 属性不起作用
- r - R group_by 多个条件聚合函数 dplyr
- postman - Newmain 进程在处理 Docker 容器中作为 Jenkins 代理运行的大约 10K 请求后终止
- r - 寻找相似词并改变它们
- node.js - 在 Node.js 中加速 xls 编辑器
- logstash-configuration - 带有弹性索引的 Logstash 只有 10,000 个文档
- c# - 制作共享库 (SDK) 安装程序
- woocommerce - WooCommerce 是否为客户的最后购买日期添加用户元数据?
- amazon-web-services - 我想阻止对我的 S3 存储桶的公共访问,但授予对其对象的只读访问权限