【问题标题】:Combine two monads when neither has a transformer?当两个单子都没有变压器时合并两个单子?
【发布时间】:2012-01-27 13:39:14
【问题描述】:

我正在玩写一个网络应用程序。在这种情况下,我使用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 块的类型为:Web.Scotty.ActionM ()。所有 redis 命令的类型都是Database.Redis.Redis a。 redis 或 scotty 都没有单子转换器。

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

理想情况下,我可以在同一个 do 块中创建一个支持 keyshtml 的新 monad 堆栈。

【问题讨论】:

  • 人们通常只满足于 haskell web 框架中的 liftIO 吗?
  • 我在这里不知道答案,但我认为您的问题类似于 monad 转换器。基本上,你想实现一个类型,我们称之为IdentityTT m' m a,这样IdentityTT m' 的行为就和IdentityT 完全一样。当然,要回答的第一个问题是这是否可能。
  • 问题的另一种表述方式是:您是否使用 liftIO 来查询所有 haskell 框架中的数据库?当数据库未纳入框架时,最常见的模式是什么?
  • 我在这里没有看到 liftIO 的问题?

标签: haskell monads monad-transformers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多