簡體   English   中英

使用快照中的閱讀器monad(或快照中的monad變換器)

[英]Using the reader monad in snap (or, monad transformers in snap)

有人可以展示如何在閱讀器monad中使用snap monad嗎? Monad變形金剛迷惑我。 (或者,我很樂意接受有關monad變換器的教程的建議,以及查看光線的方法,並最終了解它們。)

編輯:糟糕; 忘了說明我實際上要做的事情,而不是尋求特定事情的幫助。 戰略,而不是戰術。 我特別希望在所有處理程序之間共享數據庫連接/池,而不必在指定路由時顯式傳遞該數據庫連接/池。 似乎讀者monad將是實現這一目標的方法。

Snap具有ApplicationState類型,允許您打包所需的任何應用程序范圍的資源(數據庫連接,模板引擎等)

它位於生成的文件Application.hs中,默認情況下將HeistState和TimerState包含在ApplicationState中。 您可以將數據庫連接放在那里,它可以在Snap應用程序的任何位置使用。

如果你不害怕使用GHC特定的擴展,這里是monad變換器的簡單方法:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Control.Monad.Reader

data ReaderData = ...

newtype MyMonad a = MyMonad (ReaderT ReaderData Snap a)
  deriving (Monad, MonadReader ReaderData)

runMyMonad :: MyMonad a -> ReaderData -> Snap a
runMyMonad (MyMonad m) r = runReaderT m r

liftSnap :: Snap a -> MyMonad a
liftSnap act = MyMonad (lift act)

您現在可以使用asklocal來訪問閱讀器數據。 要在Snap monad中運行一個動作,你需要將它“提升”到你的新monad中。

... r <- liftSnap $ ... snap action ...

不過,您可能更喜歡較短的名字。 所以,也許只是snap

假設snap monad來自http://hackage.haskell.org/packages/archive/snap-core/0.4.0/doc/html/Snap-Types.html ... Snap是monad(不是monad變換器) ,所以你不能在任意monad中運行它。 您可以使用ReaderT轉換器在Snap中嵌入Reader功能,如果這是您想要的。

runSnap的類型是

runSnap :: Snap a -> (ByteString -> IO ()) -> (Int -> IO ()) -> Request -> Iteratee ByteString IO (Request, Response)

它告訴我們它運行在Iteratee ByteString IO monad中。 Reader monad不允許您對輸入流執行IO或迭代,因此您無法在Reader monad中運行Snap計算。

如果你解釋你想要完成什么,有人可能會建議一種方法來實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM