4

誰かがリーダーモナド内でスナップモナドを使用する方法を示すことができますか?モナド変換子は私を混乱させます。(または、モナド変換子に関するチュートリアルの提案や、光を見て最終的にそれらをグロッキングする方法の提案を喜んで受け入れます。)

編集:おっと; 特定のことについて助けを求めるのではなく、私が実際にやろうとしていることを特定するのを忘れました。戦術ではなく戦略。特に、ルートを指定するときにそのデータベース接続/プールを明示的に渡す必要なしに、すべてのハンドラー間でデータベース接続/プールを共有したいと思います。リーダーモナドがそれを達成する方法のようです。

4

3 に答える 3

5

SnapにはApplicationStateタイプがあり、必要なアプリケーション全体のリソース(db接続、テンプレートエンジンなど)をパッケージ化できます。

これは、生成されたファイルApplication.hsにあり、デフォルトでは、HeistStateとTimerStateがApplicationStateに含まれています。そこにデータベース接続を配置するだけで、Snapアプリケーションのどこからでも利用できるようになります。

于 2011-02-07T03:17:28.580 に答える
4

GHC 固有の拡張機能を使用することを恐れない場合は、モナド変換子への飾り気のないアプローチを次に示します。

{-# 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)

askとを使用localしてリーダー データにアクセスできるようになりました。モナドでアクションを実行するには、Snapそれを新しいモナドに「リフト」する必要があります。

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

ただし、短い名前を好む場合があります。だから、多分ただsnap

于 2011-02-07T01:21:34.943 に答える
0

snap モナドがhttp://hackage.haskell.org/packages/archive/snap-core/0.4.0/doc/html/Snap-Types.htmlからのものであると仮定すると... Snap はモナドです (モナド変換子ではありません)であるため、任意のモナド内で実行することはできません。必要に応じて、トランスフォーマーを使用しReaderTて、Reader 機能を Snap 内に埋め込むことができます。

のタイプrunSnap

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

Iteratee ByteString IOこれは、モナドで実行されていることを示しています。Reader モナドでは入力ストリームに対して IO や反復を実行できないため、 Reader モナドで Snap 計算を実行することはできません。

達成したいことを説明すれば、誰かがそれを達成する方法を提案できるかもしれません。

于 2011-02-06T23:58:39.577 に答える