Haskell仆人wai中间件无法正常工作

Rey*_*och 2 haskell middleware servant

所以,我想在我的服务器服务器上添加两个wai中间件.一个用于提供静态文件的中间件,另一个用于记录.

我有我的api defined(router),这就是我启动服务器的方式:

webServer :: IO ()
webServer = run 80 (middleware $ router)
Run Code Online (Sandbox Code Playgroud)

以下是我如何定义我的middleware:

middleware :: Application -> Application
middleware = do
  logStdoutDev
  staticPolicy $ addBase "static"
Run Code Online (Sandbox Code Playgroud)

现在,如果我把logStdoutDev第一个比我不能提供静态文件,但如果我放staticPolicy第一,我可以提供静态文件,但我失去了记录事件的能力(基本上他们被忽略).

问题是,如何wai在仆人中正确组合中间件.

fre*_*yle 9

如果我理解正确,你想要组成两个中间件:logStdoutDevstaticPolicy $ addBase "static".但是你做了什么?

middleware = do
    logStdoutDev
    staticPolicy $ addBase "static"
Run Code Online (Sandbox Code Playgroud)

它相当于:

middleware = logStdoutDev >> (staticPolicy $ addBase "static")
Run Code Online (Sandbox Code Playgroud)

那么,monad被用过了什么?在middleware有型Application -> Application.所以这是monad读者(->) Application.

表达式logStdoutDev >> (staticPolicy $ addBase "static")等同于\r -> (\_ -> (staticPolicy $ addBase "static") r) (logStdoutDev r).或者如果简化,我们将得到:\r -> (staticPolicy $ addBase "static") r.

你应该这样做:

middleware = logStdoutDev . (staticPolicy $ addBase "static")
Run Code Online (Sandbox Code Playgroud)