Tôi đang sử dụng thư viện servant
cho JSON API của mình. Tôi cần một số trợ giúp để có được ngăn xếp đơn nguyên ServerT MyAPI (ReaderT a IO)
hoạt động.Sử dụng công chức với ReaderT IO a
Dưới đây là một ví dụ sử dụng ReaderT
, nhưng không tích hợp nó với tớ:
-- this code works
type TestAPI =
"a" :> Get '[JSON] String
:<|> "b" :> Get '[JSON] String
test2 :: EitherT ServantErr IO String
test2 = return "asdf"
testServer :: Int -> Server TestAPI
testServer code = test :<|> test2
where
test :: EitherT ServantErr IO String
test = liftIO $ runReaderT (giveMeAMessage) code
-- this is contrived. In my real application I want to use a Reader for the database connection.
giveMeAMessage :: ReaderT Int IO String
giveMeAMessage = do
code <- ask
name <- liftIO $ getProgName
return $ show code <> name
Vì vậy, bây giờ tôi muốn có được nó làm việc với ServerT, làm theo tấm gương trong this article.
-- this code doesn't compile
testServerT :: ServerT TestAPI (ReaderT Int IO)
testServerT = test :<|> test
where
test :: EitherT ServantErr (ReaderT Int IO) String
test = lift $ giveMeAMessage
testServer' :: Int -> Server TestAPI
testServer' code = enter (Nat $ liftIO . (`runReaderT` code)) testServerT
tôi nhận được lỗi sau:
server/Serials/Route/Test.hs:43:15:
Couldn't match type ‘EitherT ServantErr (ReaderT Int IO) String’
with ‘ReaderT Int IO [Char]’
Expected type: ServerT TestAPI (ReaderT Int IO)
Actual type: EitherT ServantErr (ReaderT Int IO) String
:<|> EitherT ServantErr (ReaderT Int IO) String
In the expression: test :<|> test
In an equation for ‘testServerT’:
testServerT
= test :<|> test
where
test :: EitherT ServantErr (ReaderT Int IO) String
test = lift $ giveMeAMessage
Failed, modules loaded: none.
Làm thế nào tôi có thể thoát khỏi những lỗi?
Câu hỏi tiếp theo: Tôi hiểu biến thế đơn nguyên nói chung, nhưng tôi bị mất. Tôi nên nghiên cứu chủ đề hoặc liên kết nào để biết đủ để trả lời câu hỏi của riêng mình?
Cảm ơn pingu. Tôi đã không hiểu rằng EitherT ServantErr một loại trong chức năng máy chủ của tôi là tùy chọn, bởi vì tôi vẫn cần phải xử lý lỗi bằng cách nào đó. Tôi nghĩ rằng tôi cần phải kết thúc với điều đó. Tôi đã không nhận ra tôi có thể làm điều đó trong chức năng chạy của tôi. Xem câu trả lời của tôi dưới đây. –