1

使用 HDBC Snaplet 的教程中,它说“设计 HDBC snaplet 时的目标之一是将函数与 Handler monad 或任何与 Snap 相关的 monad 分离,以便相同的查询也可以在外部运行Snap 上下文,例如在命令行工具中。”

我正在努力做到这一点。

类型类 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 定义一个实例。

4

1 回答 1

1

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

于 2012-12-04T15:39:13.940 回答