Haskell 如何与scotty和selda一起使用monad堆栈?

Haskell 如何与scotty和selda一起使用monad堆栈?,haskell,monad-transformers,scotty,Haskell,Monad Transformers,Scotty,我一直在尝试使用scotty运行一个web服务器,它可以使用selda与我的db通信。我认为使用monad transformer堆栈可以实现类似的功能。我一直在努力解决这个问题,但我遇到了一些死胡同,这些类型似乎不可行 {-# LANGUAGE DeriveGeneric, OverloadedStrings, OverloadedLabels #-} module Server where import Web.Scotty import Data.Monoid (mconcat) im

我一直在尝试使用scotty运行一个web服务器,它可以使用selda与我的db通信。我认为使用monad transformer堆栈可以实现类似的功能。我一直在努力解决这个问题,但我遇到了一些死胡同,这些类型似乎不可行

{-# LANGUAGE DeriveGeneric, OverloadedStrings, OverloadedLabels #-}

module Server where

import Web.Scotty
import Data.Monoid (mconcat)
import Data.Aeson (ToJSON)
import GHC.Generics
import Web.Scotty
import Database.Selda
import Database.Selda.SQLite
import Control.Monad.Trans.Class

import Models

type App = SeldaT SQLite ScottyM

-- withPersist:: (MonadIO m, MonadMask m) => SeldaT SQLite m a -> m a
server = scotty 4200 (withPersist router)

router :: App ()
router = do
  lift $ get "/book/:id" searchBook

searchBook:: ActionM ()
searchBook = do
  books <- query selectBookQuery
  json books
    where
      selectBookQuery = do
        book <- select goodreadsBooks
        restrict (book ! #goodreadsId .== "20")
        return book

更新:在看了一些类似的问题之后,我可能需要使用ScottyT。不知道如何将SeldaT嵌套在ScottyT transformer中。

在查看了大量其他答案并了解了更多有关monad transformer的信息后,我找到了以下解决方案:

{-# LANGUAGE DeriveGeneric, OverloadedStrings, OverloadedLabels #-}

module Server where

import Web.Scotty.Trans
import Database.Selda
import Database.Selda.SQLite
import Control.Monad.Trans.Class
import Control.Monad.Identity
import qualified Data.Text.Lazy as TL

import Models

server :: IO ()
server = scottyT 4200 withPersist router

router :: ScottyT TL.Text (SeldaT SQLite IO) ()
router = do
  get "/book/:id" searchBook

searchBook:: ActionT TL.Text (SeldaT SQLite IO) ()
searchBook = do
  books <- lift $ query selectBookQuery
  json books
    where
      selectBookQuery = do
        book <- select goodreadsBooks
        restrict (book ! #goodreadsId .== "20")
        return book
{-#语言派生通用、重载字符串、重载标签#-}
模块服务器在哪里
导入Web.Scotty.Trans
导入数据库.Selda
导入Database.Selda.SQLite
导入控制.Monad.Trans.Class
导入控制.Monad.Identity
将限定的Data.Text.Lazy作为TL导入
导入模型
服务器::IO()
服务器=Scottyt4200,带持久路由器
路由器::ScottyT TL.Text(SeldaT SQLite IO)()
路由器=do
获取“/book/:id”搜索簿
searchBook::ActionT TL.Text(SeldaT SQLite IO)()
searchBook=do
书
{-# LANGUAGE DeriveGeneric, OverloadedStrings, OverloadedLabels #-}

module Server where

import Web.Scotty.Trans
import Database.Selda
import Database.Selda.SQLite
import Control.Monad.Trans.Class
import Control.Monad.Identity
import qualified Data.Text.Lazy as TL

import Models

server :: IO ()
server = scottyT 4200 withPersist router

router :: ScottyT TL.Text (SeldaT SQLite IO) ()
router = do
  get "/book/:id" searchBook

searchBook:: ActionT TL.Text (SeldaT SQLite IO) ()
searchBook = do
  books <- lift $ query selectBookQuery
  json books
    where
      selectBookQuery = do
        book <- select goodreadsBooks
        restrict (book ! #goodreadsId .== "20")
        return book