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