2

我正在尝试将 Hasql.Pool 库(并且最终不会远离 hasql 生态系统太远)和仆人处理程序结合起来。

简而言之,如果我使用纯函数,我将不得不像这样传递我的连接池:

tertiaryHandlers :: Pool -> Server API
tertiaryHandlers pool = getAges pool :<|> getNames pool :<|> getDOB pool

之后会有数百个,所以你明白了。

有人告诉我,在这种情况下,使用 Reader monad 是正确的选择,再加上 Servant 包本身的提升服务器功能。我对 monad 转换器并不完全放心,所以只是设法达到了这种代码(由于类型错误,这显然不起作用)

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE RankNTypes #-}

import Hasql.Pool
import Servant
import Control.Monad.Reader
import Network.Wai.Handler.Warp
import Network.Wai
import Control.Applicative

import EdgeNodePrelude

type API = "api" :> ("name" :> Get '[JSON] Text :<|> "age" :> Get '[JSON] Int64)

api :: Proxy API
api = Proxy

readerServer :: ServerT API (Reader Pool)
readerServer = return $ getName :<|> getAge

server pool = hoistServer api nt readerServer :: Server API
  where nt x = return (runReader x pool)

getName :: Reader Pool (Handler Text)
getName = do
  pool <- ask
  return "Text"

getAge :: Reader Pool (Handler Int64)
getAge = do
  pool <- ask
  return 23

main :: IO ()
main = do
    pool <- acquire (8,1,"")
    run 8080 (serve api $ server pool)

非常感谢提前

4

0 回答 0