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)约束从何而来
  • 如何调整上述代码以使整个处理程序通过自然转换

Api类型中不能有
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
端点;如果你做了,结果是一个奇怪的类型错误。结果证明这是正确的答案!你能把你的回复升级为一个答案吗?这样我就可以给你评分了?