2012-01-27 5 views
13

私はウェブアプリを書くことで遊んでいます。この場合、私はscottyredisを使用していますが、この問題はどのWeb/dbコンボでも発生します。私はこれの前にハッシュスタックを使用していたので、そこにも例が大好きです。2つのモナドのどちらもトランスを持っていない場合、それらを結合しますか?

スコッティは、あなたがルート内のデータベース接続へのアクセスが容易になり、ネストされたモナド、中にルートを定義していますWeb.Scotty.ActionM()

main = do 
    db <- connect defaultConnectInfo 
    scotty 3000 $ do 

    get "/keys" $ do 
     keys <- liftIO $ runRedis db $ keys "*" 
     html $ T.pack $ show keys 

ザ・がGETでブロックしないタイプがあります。すべてのredisコマンドのタイプはDatabase.Redis.Redis aです。 redisまたはscottyにはモナドトランスがありません。

これらを組み合わせるにはどうすればよいですか?私はhaskellを初めて使っていますが、私はReaderTをhappstackのウェブモナドと連携させることができました。

理想的には、同じdoブロック内にkeyshtmlの両方をサポートする新しいモナドスタックを作ることができます。

+1

人々は通常、haskell WebフレームワークでliftIOを解決するだけですか? –

+1

私はここで答えは分かりませんが、あなたの問題はモナド変圧器に似ていると思います。基本的には、型を実装したいとします。それを 'IdentityTT m 'と呼んで、' IdentityT' mが 'IdentityT'のように振る舞うようにします(http://hackage.haskell.org/packages/archive/transformers /0.2.1.0/doc/html/Control-Monad-Trans-Identity.html)。もちろん答えが出る最初の質問は、それが可能なのかどうかということです。 –

+0

問題をフレーズする別の方法は次のとおりです。すべてのhaskellフレームワークのデータベースにliftIOを使用してクエリを実行しますか?データベースがフレームワークに焼き付けられていないときの最も一般的なパターンは何ですか? –

答えて

4

私は何かの理由でリフトIOが醜いと感じましたが、それは本当に悪くありません。

queryRedis :: Connection -> Redis a -> ActionM a 
queryRedis db r = liftIO $ runRedis db r 

を部分的に適用される機能redis = queryRedis dbを定義します。あなたはこれを行う場合は特に。ありがとうすべて

関連する問題