haskell - 当两个单子(monad)都没有变压器时合并两个单子(monad)?

标签 haskell monads monad-transformers

我正在玩写一个网络应用程序。在这种情况下,我使用 scottyredis ,但是这个问题出现在任何 web/db 组合中。在此之前我使用了 happstack,所以我也喜欢那里的一个例子。

Scotty 让您在嵌套的 monad 中定义路由,这使得访问路由中的数据库连接变得容易:

main = do
    db <- connect defaultConnectInfo
    scotty 3000 $ do

    get "/keys" $ do
        keys <- liftIO $ runRedis db $ keys "*"
        html $ T.pack $ show keys

get 中的 do block 的类型为:Web.Scotty.ActionM () .所有 redis 命令的类型为 Database.Redis.Redis a . redis 或 scotty 都没有单子(monad)转换器。

将这些结合起来的最佳方法是什么?我是haskell 的新手,但我确实设法让ReaderT 与happstack 中的web monad 一起工作。

理想情况下,我可以以某种方式创建一个支持 keys 的新 monad 堆栈。和 html在同一个做 block 。

最佳答案

出于某种原因,我觉得 liftIO 很丑,但它真的不错。特别是如果你这样做:

queryRedis :: Connection -> Redis a -> ActionM a
queryRedis db r = liftIO $ runRedis db r

并定义一个部分应用函数redis = queryRedis db .感谢大家

关于haskell - 当两个单子(monad)都没有变压器时合并两个单子(monad)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9034060/

相关文章:

f# - 单一案例歧视工会的目的

haskell - 为什么存在bind(>>=)?没有绑定(bind)的解决方案很丑陋的典型情况是什么?

带有 Coproduct 和 monad 转换器的 Scala Free Monads

haskell - `Except` 的复杂性在 Haskell 中有何用途?

generics - 具有唯一 ID 的 Haskell 泛型

haskell - 在 Haskell 中播放声音样本的最简单方法是什么?

haskell - 如何让 Reader 和 ReaderT 协同工作

haskell - 让每个 monad 转换器成为 MonadTrans 的实例真的是默认做法吗?

haskell - 动态类型语言中的 IO Monad

haskell 执行程序。文件和cmd