【问题标题】:How do you make a Snaplet like HasHdbc work outside the Snap context?你如何让像 HasHdbc 这样的 Snaplet 在 Snap 上下文之外工作?
【发布时间】:2012-12-03 22:21:31
【问题描述】:

the tutorial for using the HDBC Snaplet 中,它说“设计 HDBC snaplet 时的目标之一是将函数与 Handler monad 或任何与 Snap 相关的 monad 分离,以便相同的查询也可以在捕捉上下文,例如在命令行工具中。”

我正在努力实现这一点。

类型类 HasHdbc 有定义

class  (  IConnection c
       ,  ConnSrc s
       ,  MonadCatchIO m
       )
  =>   HasHdbc m c s | m -> c s where
  getHdbcState :: m (HdbcSnaplet c s)

可以这样定义 Snap 应用的这种类型类的实例:

instance HasHdbc (Handler App App) Connection IO where
  getHdbcState = with dbLens get

有人能画出如何使用 HasHdbc 类型类在 Snap 上下文之外制作这个命令行工具吗?我对类型类有基本的了解,但是类型签名getHdbcState :: m (HdbcSnaplet c s) 对我来说是一个挑战,比如为 IO Monad 定义一个实例。

【问题讨论】:

    标签: haskell haskell-snap-framework


    【解决方案1】:

    你在正确的轨道上。您确实需要为要使用的任何 monad 定义一个 HasHdbc 实例。为此,您必须定义一个返回 HdbcSnaplet 的函数 getHdbcState。进入该数据类型的信息不可能来自任何地方,但 getHdbcState 函数不接受任何参数。这意味着您要么必须为数据库服务器输入常量,要么从文件或其他东西中读取它们。更灵活的方法是为 ReaderT 或 Reader 创建一个 HasHdbc 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2012-02-29
      • 2020-01-27
      相关资源
      最近更新 更多