2017-08-18 5 views
2

こんにちは私はHaskellにはかなり新しく、私はScottyとSqliteで小さなWebアプリケーションを開発してきました。ScottyとSqliteを使ってMonadsにいくつかの問題がある

Scotty Actions内でSqlite操作を実行する際に問題があります。 2つのライブラリを孤立して使用していると理解しています。

は、ここでは、私はまだあまりにも命令的に考えて立ち往生しています見ることができるよう

-- imports ... 

routes :: ScottyM() 
routes = do 
    post "data/:id" $ do 
     id <- param "id" 
     -- HERE IS WHERE I GET CONFUSED 
     -- This is what I want to do 
     db <- open "store.db" 
     exec db "INSERT INTO Store (id, value) VALUES (" <> id <> ", 'Test Value');" -- I know there is SQL Injection here I will learn about parameterized queries in haskell next 
     close db 
     -- END THE PART I AM CONFUSED BY 
     text $ "created a record with " <> id <> " id." 

main :: IO() 
    scotty 3000 routes 

だから私のコードのMVPです。 IポストのタイプはActionM(知っている) - > ScottyM() と私は近いデシベルのタイプはIO(知っている)

だから私は、私は ActionMを(行く合成関数である必要だと思うものを) - > IO() - > ScottyM() これを書く方法はわかりません。

これは正しいトラックですか?

すべてのアドバイスは大変ありがとうございます。

答えて

4

モナドスタック(技術的には、モナドトランスフォーマースタック)。これは、いくつかの高度なモナドでは、より基本的なモナドをスタックの下にさらに置くことが可能であることを意味します。

lift関数は、1つのレベルからスタックを下って関数を取り、現在の関数に "持ち上げ"ます。 liftIO関数は一般的なIO関数をとり、それを現在のコンテキストに持ち上げます。 (含まれていれば、IOは常にMonad Transformerスタックの一番下にあります)

Real World HaskellHaskell Wikiは両方ともMonadトランスフォーマで優れた章を持っています。

+0

ありがとう、私はこれらが存在するかどうかわからなかった!学ぶだけでもっと。 –

関連する問題