2011-02-06 4 views
4

誰かが読者モナド内でスナップモナドを使用する方法を示すことができますか?モナド変圧器は私を混乱させる。 (あるいは、モナド変圧器についてのチュートリアルの提案や、光を見て最終的にはそれを掘り起こす方法を喜んで受け入れます)スナップモードで読者モナドを使用する(またはスナップモードでモナドトランスを使用する)

編集:おっと、私は実際に何をしようとしているのかを特定するのを忘れました。戦略、戦術ではない。私は特に、ルートを指定するときにデータベース接続/プールを明示的に渡すことなく、すべてのハンドラ間でデータベース接続/プールを共有したいと考えています。読者のモナドがそれを達成する方法になると思われる。

答えて

5

スナップはあなたが必要なものは何でもアプリケーション全体のリソース(DB接続、テンプレートエンジンなど)

これは、生成されたファイルApplication.hsに位置しており、デフォルトではHeistStateとTimerStateがApplicationStateに含まれているをパッケージ化できますApplicationStateタイプを持っています。 db接続をそこに置くだけで、Snapアプリケーションのどこからでも利用できます。

+0

これはスナップ私が使用した最後のバージョン(0.2.xの何か、私が知っている間、私は知っている)以来、新しくする必要がありますが、それはちょうど私が望んでいたものです。ありがとう。 – tehgeekmeister

0

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

runSnapの種類は、それがIteratee ByteString IOモナドで実行されていることを教えてくれる

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

です。 ReaderモナドではIOを実行したり、入力ストリームを繰り返したりすることはできないため、ReaderモナドでSnap計算を実行することはできません。

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

+0

私は本当に後悔したことを反映するように更新されました。残念です。 – tehgeekmeister

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) 

あなたは今、読者のデータにアクセスするためにasklocalを使用することができます。 Snapモナドでアクションを実行するには、それを新しいモナドに「持ち上げる」必要があります。

ただし、短い名前を使用することもできます。だから、おそらくちょうどsnap

+0

あなたは 'newtype'を必要としません。それは単に型の同義語です:' type MyMonad = ReaderT ReaderData Snap'です。次に、標準の 'lift :: Snap a - > MyMonad a'を使用します。 – luqui

+0

ここのReaderDataは、私が読者にしたいと思っているものだけです。 – tehgeekmeister

+1

@tehgeekmeister:はい。 @luqui:私の経験では、newtypeを使用しないと、通常はさらに問題が発生します。 – nominolo

関連する問題