Как построить интуицию для ошибок типа Servant? - PullRequest
2 голосов
/ 09 июля 2019

Я застрял со следующей ошибкой после крупного рефакторинга кода:

    • Couldn't match type ‘Endpoint.AuditLog.Routes
                             (AsServerT (AppM '[] ()))’
      with

      --
      -- complete API type comes here
      --

      Expected type: ServerT Routes (AppM '[] ())
        Actual type: Endpoint.AuditLog.Routes (AsServerT (AppM '[] ()))
    • In the expression: (Endpoint.AuditLog.server appRunners)
      In an equation for ‘prodServer’:
          prodServer = (Endpoint.AuditLog.server appRunners)      

Я прочитал и перечитал документацию , но, похоже, не могу найти, где находится ошибка. Этот код работал ранее, и я изменил Endpoint.AuditLog.server :: Routes (AsServerT AppM) на Endpoint.AuditLog.server :: AppRunners m n -> Routes (AsServerT n) и подтвердил, что тип следующих выражений, похоже, одинаков во всем рефакторе; в основном Routes (AsServerT AppM) изменилось на Routes (AsServerT (AppM '[] ()))

ghci> :t (Endpoint.AuditLog.server AppM.appRunners)
(Endpoint.AuditLog.server AppM.appRunners) :: Routes (AsServerT (AppM '[] ()))

Следующий фрагмент также структурно одинаков для всего рефакторинга:

type Routes = (ToServant Endpoint.AuditLog.Routes AsApi)

prodServer :: ServerT Routes (AppM '[] ())
prodServer = (Endpoint.AuditLog.server AppM.appRunners)

Как мне отладить эту ошибку? Поскольку задействовано много семейств типов, есть ли способ увидеть, к чему упрощают следующие выражения на уровне типов:

  • ServerT Routes (AppM '[] ())
  • Endpoint.AuditLog.Routes (AsServerT (AppM '[] ()))

1 Ответ

1 голос
/ 09 июля 2019

ругательство!Ругательство!Превосходно!

Мне не хватало toServant -

prodServer :: ServerT Routes (AppM '[] ())
prodServer = (toServant $ Endpoint.AuditLog.server AppM.appRunners)
...