Servant使用Servant.API.safeLink生成相对的URL,但我遇到了一个问题,这让我认为我误解了一些基本的东西,无论是关于如何使用它,还是关于如何定义Servant API。
我构造的最小示例包含两个端点。一个是在(相对URL) /foo上的“前门”端点,另一个是在/foo/1上的。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import Servant
data HTML
type Foo = "foo" :> (Foo0 :<|> Foo1)
type Foo0 = Get '[HTML] String
type Foo1 = "1" :> Get '[HTML] String
slFoo :: Link
slFoo = safeLink (Proxy :: Proxy Foo) (Proxy :: Proxy Foo1)上面对slFoo的定义给出了错误
Could not deduce: IsElem' ("1" :> Get '[HTML] String) ("foo" :> (Foo0 :<|> Foo1))
当safeLink被要求生成一个不在其第一个参数定义的API中的链接时,...which就是我得到的那种错误。当safeLink的第二个参数为Proxy :: Foo0时,错误类似。
我已经尝试了很多很多这样的排列,但似乎无法通过使用我找到的文档自己弄清楚。如果能给我一些建议,让我找出误解所在,我会很感激。
发布于 2019-06-13 15:10:49
这个示例不起作用,因为您为端点定义的类型Foo1本身并不包含其自身相对于Foo应用编程接口顶部的完整路径。
解决这种情况的一种方法是使用“扁平化”API:
safeLink (Proxy :: Proxy (Flat Foo)) (Proxy :: Proxy (Nth 1 (Flat Foo)))
(还需要import Servant.API.Flatten )
缺点是您必须知道Foo1在Foo中的序号位置。似乎没有办法通过使用问题中指定的类型来获得您想要的答案。您可以首先定义扁平化的API,但代价是使结构清晰(IMO)。
感谢Alp Mestanogullari在上面的问题评论中向我解释了这一点。他的回答真的应该得到表扬!
https://stackoverflow.com/questions/56318061
复制相似问题