Haskell servant结合了api实现



我正在浏览这里的仆人教程。还有一个部分实现留给用户来决定它应该是什么

type APIFor a i =
Get '[JSON] [a]
:<|> ReqBody '[JSON] a :> PostNoContent
:<|> Capture "id" i :>
( Get '[JSON] a
:<|> ReqBody '[JSON] a :> PutNoContent
:<|> DeleteNoContent
)
serverFor :: Handler [a]
-> (a -> Handler NoContent)
-> (i -> Handler a)
-> (i -> a -> Handler NoContent)
-> (i -> Handler NoContent)
-> Server (APIFor a i)
serverFor = error "..." -- What should be here?

根据前面的例子,我提出了实现:

serverFor = listing :<|> ops
where
listing :: Handler [a]
listing = error ""
ops a i =
creating a
:<|> getById i
:<|> updating i a
:<|> deleting i
where
creating :: a -> Handler NoContent
creating a = error ""
getById :: i -> Handler a
getById id = error ""
updating :: i -> a -> Handler NoContent
updating i a = error ""
deleting :: i -> Handler NoContent
deleting i = error ""

但是我得到了错误:

• Couldn't match expected type ‘Handler [a]
-> (a -> Handler NoContent)
-> (i -> Handler a)
-> (i -> a -> Handler NoContent)
-> (i -> Handler NoContent)
-> Server (APIFor a i)’
with actual type ‘Handler [a0]
:<|> (a1
-> i0
-> Handler NoContent
:<|> (Handler a2
:<|> (Handler NoContent :<|> Handler NoContent)))’
• Possible cause: ‘(:<|>)’ is applied to too many arguments
In the expression: listing :<|> ops

我理解错误的含义,但不知道如何正确实现。有人能帮助制定正确的实施方案吗?

serverFor函数的签名表示它接受处理程序函数并构建Server

serverFor list create get update delete = 
-- combine handlers according to API type
list :<|> create :<|> (i -> get i :<|> update i :<|> delete i)

然后,您可以为您的特定类型调用serverFor

data User = User {id :: Int}
server :: Server (APIFor User Int)
server = serverFor listing creating getById updating deleting
where
listing :: Handler [User]
listing = error ""
creating :: User -> Handler NoContent
creating a = error ""
getById :: Int -> Handler User
getById id = error ""
updating :: Int -> User -> Handler NoContent
updating i a = error ""
deleting :: Int -> Handler NoContent
deleting i = error ""

最新更新