我编写了一个简单的 WAI 应用程序,它使用 ReaderT 来允许访问请求,如下所示:
import qualified Network.Wai as W
handle :: (Resource a) => a -> ReaderT W.Request IO W.Response
handle
执行大部分处理的函数在哪里。然后我在我的应用程序中调用它:
app :: W.Application
app = runReaderT (handle a) -- simplified; i don't think the value of a matters
main :: IO ()
main = run 3000 app
但runhaskell main.hs
给了我以下内容:
Couldn't match expected type `Control.Monad.Trans.Resource.ResourceT
IO'
with actual type `IO'
Expected type: ReaderT
W.Request (Control.Monad.Trans.Resource.ResourceT IO) W.Response
Actual type: ServerMonad W.Response
In the return type of a call of `handle'
In the first argument of `runReaderT', namely
`(handle a)'
这让我感到困惑有两个原因:
- 我不知道为什么它期待那种类型
- 调用
resp <- runReaderT (handle a) defaultRequest
在 GHCI 中有效!
为什么会这样?