首页 > 解决方案 > 使用 Scotty,我如何将 ScottyM 与自定义 monad 与 ScottyT 结合起来

问题描述

data MyAppR = MyAppR {
  dbPool :: Pool Connection
                     }

type NewApp = ReaderT (MyAppR) IO
type AppActionNew a = ActionT L.Text NewApp a
type AppServerNew a = ScottyT L.Text NewApp a

type App = IO
type AppServer a = ScottyT L.Text App a
type AppAction a = ActionT L.Text App a
type AppActionT = ActionT L.Text App

如何定义一个函数,例如:

mylift :: AppServer () -> AppServerNew ()
mylift a = undefined

发布它以防万一有人已经有了解决方案,否则我只会弄清楚这一点。不幸的是ScottyT/ActionT不是一个单子变压器,所以我不能只做通常的提升。


这样做的全部原因是,我现在需要一个用于我的应用程序的数据库池,但我不想费心在任何地方更改AppServer类型,然后在所有地方提升。可能只是结合和混合AppServer更快AppServerNew

类型检查的初始解决方案 - 但似乎无法正常工作,因为所有“处理程序”都以 404 响应:

mylift :: AppServer () -> AppServerNew ()
mylift (ScottyT x) = pure $ evalState x def

标签: haskellscotty

解决方案


推荐阅读