2

嗨,我是 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

因此,正如您所看到的,我仍然过于迫切地思考。我知道帖子的类型是 ActionM () -> ScottyM () 并且我知道关闭数据库的类型是 IO ()

所以我认为我需要的是一个复合函数,它是 ActionM () -> IO () -> ScottyM () 我只是不知道如何写这个。

这是在正确的轨道上吗?

非常感谢任何和所有建议。

4

1 回答 1

4

Monad 堆栈(从技术上讲,Monad Transformers 堆栈)。这意味着在一些高级 monad 中,可以用更底层的更基本的 monad 来做事情。

lift函数将从堆栈的下一层获取一个函数并将其“提升”到当前层。该liftIO函数将采用通用 IO 函数并将其提升到当前上下文中。(IO,如果包含的话,总是Monad Transformer栈的底部)

Real World HaskellHaskell Wiki都有关于 Monad Transformers 的好章节。

于 2017-08-18T18:27:09.447 回答