使用 Scotty 和 Sqlite 并在使用 Monad 时遇到一些麻烦
Working with Scotty and Sqlite and having some trouble with the Monads
您好,我是 Haskell 的新手,我一直在使用 Scotty 和 Sqlite 开发一个小型 Web 应用程序。
我在 Scotty Actions 中执行 Sqlite 操作时遇到问题。
当单独使用时,我有点理解这两个库。
这是我的代码的 MVP
-- 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
因此,正如您所见,我仍然在思考太多命令式问题。
我知道 post 的类型是 ActionM() -> ScottyM()
我知道关闭数据库的类型是 IO ()
所以我认为我需要的是一个复合函数
ActionM() -> IO() -> ScottyM()
我只是不知道怎么写。
这是在正确的轨道上吗?
非常感谢任何和所有建议。
Monad 堆栈(技术上,Monad Transformers 堆栈)。这意味着在一些高级 monad 中,可以在堆栈的更下方使用更基本的 monad。
lift
函数将从堆栈的下一层获取一个函数,然后 "lift" 将其放入当前层。 liftIO
函数将采用通用 IO 函数并将其提升到当前上下文中。 (IO,如果包含的话,总是在 Monad Transformer 堆栈的底部)
Real World Haskell and the Haskell Wiki 都有关于 Monad 变形金刚的好章节。
您好,我是 Haskell 的新手,我一直在使用 Scotty 和 Sqlite 开发一个小型 Web 应用程序。
我在 Scotty Actions 中执行 Sqlite 操作时遇到问题。 当单独使用时,我有点理解这两个库。
这是我的代码的 MVP
-- 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
因此,正如您所见,我仍然在思考太多命令式问题。 我知道 post 的类型是 ActionM() -> ScottyM() 我知道关闭数据库的类型是 IO ()
所以我认为我需要的是一个复合函数 ActionM() -> IO() -> ScottyM() 我只是不知道怎么写。
这是在正确的轨道上吗?
非常感谢任何和所有建议。
Monad 堆栈(技术上,Monad Transformers 堆栈)。这意味着在一些高级 monad 中,可以在堆栈的更下方使用更基本的 monad。
lift
函数将从堆栈的下一层获取一个函数,然后 "lift" 将其放入当前层。 liftIO
函数将采用通用 IO 函数并将其提升到当前上下文中。 (IO,如果包含的话,总是在 Monad Transformer 堆栈的底部)
Real World Haskell and the Haskell Wiki 都有关于 Monad 变形金刚的好章节。