首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Servant中的safeLink

Servant中的safeLink
EN

Stack Overflow用户
提问于 2019-05-27 07:11:23
回答 1查看 181关注 0票数 4

Servant使用Servant.API.safeLink生成相对的URL,但我遇到了一个问题,这让我认为我误解了一些基本的东西,无论是关于如何使用它,还是关于如何定义Servant API。

我构造的最小示例包含两个端点。一个是在(相对URL) /foo上的“前门”端点,另一个是在/foo/1上的。

代码语言:javascript
复制
{-# 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时,错误类似。

我已经尝试了很多很多这样的排列,但似乎无法通过使用我找到的文档自己弄清楚。如果能给我一些建议,让我找出误解所在,我会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 15:10:49

这个示例不起作用,因为您为端点定义的类型Foo1本身并不包含其自身相对于Foo应用编程接口顶部的完整路径。

解决这种情况的一种方法是使用“扁平化”API:

safeLink (Proxy :: Proxy (Flat Foo)) (Proxy :: Proxy (Nth 1 (Flat Foo)))

(还需要import Servant.API.Flatten )

缺点是您必须知道Foo1Foo中的序号位置。似乎没有办法通过使用问题中指定的类型来获得您想要的答案。您可以首先定义扁平化的API,但代价是使结构清晰(IMO)。

感谢Alp Mestanogullari在上面的问题评论中向我解释了这一点。他的回答真的应该得到表扬!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56318061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档