Haskell 如何使用服务库中的Enter键解决类型错误?
我正试图使用Haskell 如何使用服务库中的Enter键解决类型错误?,haskell,servant,Haskell,Servant,我正试图使用enter函数来允许我在一组异常的情况下运行API处理程序,我将在较高级别上将这些异常转换为SERVICE,但我在类型匹配方面遇到了问题 鉴于这一最小定义集: -- server :: Config -> Server Routes server :: Config -> ServerT Routes (ExceptT ServantErr IO) server c = enter runApp (handlers c) -- runApp :: AppM :~>
enter
函数来允许我在一组异常的情况下运行API处理程序,我将在较高级别上将这些异常转换为SERVICE,但我在类型匹配方面遇到了问题
鉴于这一最小定义集:
-- server :: Config -> Server Routes
server :: Config -> ServerT Routes (ExceptT ServantErr IO)
server c = enter runApp (handlers c)
-- runApp :: AppM :~> Handler
runApp :: ExceptT AppErr IO :~> ExceptT ServantErr IO
runApp = Nat undefined
handlers :: Config -> ServerT Routes (ExceptT AppErr IO)
handlers = undefined
我最终遇到了以下类型的错误:
Couldn't match type `IO' with `ExceptT ServantErr IO'
arising from a functional dependency between:
constraint `servant-0.7.1:Servant.Utils.Enter.Enter
(IO ResponseReceived)
(ExceptT AppErr IO :~> ExceptT ServantErr IO)
(IO ResponseReceived)'
arising from a use of `enter'
instance `servant-0.7.1:Servant.Utils.Enter.Enter
(m a) (m :~> n) (n a)'
at <no location info>
In the expression: enter runApp (handlers c)
In an equation for `server': server c = enter runApp (handlers c)
因此,当我调用enter runApp
时,我希望类型如下:
enter :: (m :~> n) -> m a -> n a
enter (runApp :: m ~ ExceptT AppErr IO :~> n ~ ExceptT ServantErr IO) :: ExceptT AppErr IO a -> ExceptT ServantErr IO a
(上面我使用了n~除了ServantErr IO
来说明我的类型替换)
事实上,我从其他代码(我尝试过模仿,但我不知道哪里出错了)中知道,enter runApp
应该/必须具有以下类型:
enter runApp :: ServerT Routes (ExceptT AppErr IO a) -> ServerT Routes (ExceptT ServantErr IO a)
因此,问题很多:
- enter runApp的实际类型是什么(不是ghci给我的,而是更具描述性的解释)
- (IO ResponseReceived)约束从何而来
- 如何调整上述代码以使整个处理程序通过自然转换
Raw
端点。方法是将原始端点从处理程序中取出并调用它,例如
server c = enter runApp (handlers c) :<|> handleRaw
server c=输入runApp(handlers c):handleRaw
Api类型中不能有Raw
端点。方法是将原始端点从处理程序中取出并调用它,例如
server c = enter runApp (handlers c) :<|> handleRaw
server c=输入runApp(handlers c):handleRaw
路线的外观如何?我不确定这是否在新版本的servant中得到了解决,但在路由中不能有Raw
端点;如果你做了,结果是一个奇怪的类型错误。结果证明这是正确的答案!你能把你的回复升级为一个答案吗?这样我就可以给你评分了。路线是什么样子的?我不确定这是否在新版本的servant中得到了解决,但在路由中不能有Raw
端点;如果你做了,结果是一个奇怪的类型错误。结果证明这是正确的答案!你能把你的回复升级为一个答案吗?这样我就可以给你评分了?