私はウェブアプリを書くことで遊んでいます。この場合、私はscottyとredisを使用していますが、この問題はどの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ブロック内にkeys
とhtml
の両方をサポートする新しいモナドスタックを作ることができます。
人々は通常、haskell WebフレームワークでliftIOを解決するだけですか? –
私はここで答えは分かりませんが、あなたの問題はモナド変圧器に似ていると思います。基本的には、型を実装したいとします。それを 'IdentityTT m 'と呼んで、' IdentityT' mが 'IdentityT'のように振る舞うようにします(http://hackage.haskell.org/packages/archive/transformers /0.2.1.0/doc/html/Control-Monad-Trans-Identity.html)。もちろん答えが出る最初の質問は、それが可能なのかどうかということです。 –
問題をフレーズする別の方法は次のとおりです。すべてのhaskellフレームワークのデータベースにliftIOを使用してクエリを実行しますか?データベースがフレームワークに焼き付けられていないときの最も一般的なパターンは何ですか? –