2012-12-03 38 views
1

the tutorial for using the HDBC Snaplet中,它表示「設計HDBC snaplet時的目標之一是將函數與Handler monad或任何Snap相關的monad分開,以便相同的查詢也可以在Snap上下文之外運行,例如在命令行工具中。「你如何讓像HasHdbc這樣的Snaplet在Snap環境之外工作?

我正試圖完成這一點。

的類型類HasHdbc有定義

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

一會定義這個類型類捕捉應用程序的一個實例是這樣的:

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

有人能畫出一個如何使這個命令行工具外Snap上下文,使用HasHdbc類型類?我理解基本級別的類型類型,但類型簽名getHdbcState :: m (HdbcSnaplet c s)對我定義IO Monad的實例有一些挑戰。

回答

1

你在正確的軌道上。你確實需要爲你想要使用的monad定義一個HasHdbc實例。要做到這一點,你必須定義一個返回HdbcSnaplet的函數getHdbcState。該數據類型中的信息不能來自任何地方,但getHdbcState函數不會接受任何參數。這意味着你要麼必須爲數據庫服務器輸入常量,要麼從文件或其他東西中讀取它們。更靈活的方法是爲ReaderT或Reader製作一個HasHdbc實例。

相關問題