【问题标题】:How to lift to Servant Server type?如何提升到Servant Server类型?
【发布时间】:2021-05-28 00:31:25
【问题描述】:

以下代码有问题:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

module API where

import           Data.Text
import           Servant.API
import           Servant
import           Repository 
import           FileOperation
import           Util
import           Config
import qualified Data.Map                   as M
import           Control.Monad.State.Strict (liftIO)
import           Network.Wai.Handler.Warp

type RepositoryAPI = "repository" :> "all" :> Get '[JSON] [Repository] 
                :<|> "all" :> "repository" :> Get '[JSON] [Repository]

server :: Server RepositoryAPI
server = do
  repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
  let repositories = M.elems repositoriesMap in do
    return repositories 

repositoryAPI :: Proxy RepositoryAPI 
repositoryAPI = Proxy

app :: Application
app = serve repositoryAPI server

main :: IO ()
main = run 8081 app

我得到的错误是:

API.hs:22:3: error:
    • Couldn't match type ‘[a0]’ with ‘Handler [Repository]’
      Expected type: Server RepositoryAPI
        Actual type: Handler [Repository] :<|> [a0]
    • In a stmt of a 'do' block:
        repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
      In the expression:
        do repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
           let repositories = ... in do return repositories
      In an equation for ‘server’:
          server
            = do repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
                 let ... in do ...
   |
22 |   repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

问题是如何正确升降,让升降返回Servant Server类型?

【问题讨论】:

    标签: haskell servant


    【解决方案1】:

    这个问题与举重无关。真正的问题是您只指定了一个Handler,但您的服务器需要两个Handlers,一个用于"repository" :&gt; "all" :&gt; Get '[JSON] [Repository],一个用于"all" :&gt; "repository" :&gt; Get '[JSON] [Repository]。这是你的第二个骨架(用这个替换你现有的server):

    getRepositoryAll :: Handler [Repository]
    getRepositoryAll = do
      repositoriesMap <- liftIO $ loadFromFile repositoryMapFile
      let repositories = M.elems repositoriesMap in do
        return repositories 
    
    getAllRepository :: Handler [Repository]
    getAllRepository = undefined -- fill this in
    
    server :: Server RepositoryAPI
    server = getRepositoryAll :<|> getAllRepository
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多