你如何让像HasHdbc这样的Snaplet在Snap上下文之外工作?

时间:2012-12-03 22:21:31

标签: haskell haskell-snap-framework

the tutorial for using the 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 app的类型类的实例:

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

有人可以使用HasHdbc类型类概述如何在Snap上下文之外创建此命令行工具吗?我理解基本级别的类型类,但类型签名getHdbcState :: m (HdbcSnaplet c s)对于我定义一个例如IO Monad的实例来说是一个挑战。

1 个答案:

答案 0 :(得分:1)

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