【发布时间】:2017-06-08 17:34:26
【问题描述】:
servant paper 的介绍包含以下示例 API 类型:
type Echo = "echo"
:> ReqBody ’[PlainText] String
:> Get ’[PlainText] String
我试图理解这个例子。似乎是在定义一个类型同义词,但似乎涉及到一些我以前没有见过的东西。
我有以下三个问题:
- 类型定义中怎么会有字符串字面量?
"echo" 是一个字符串文字。我以为这些只用于定义特定的字符串,不知道在类型声明中使用时这是什么意思。
:>的符号是什么?
'servant' 包中这个符号的定义似乎是defined here,看起来像这样:
data (path :: k) :> a
deriving (Typeable)
infixr 9 :>
我猜:> 对应于 api 字符串中的 /,但看不出这个定义是如何实现的。
这是我第一次看到函数类型->以外的非字母数字类型。
- 列表类型前的撇号是什么意思?
[PlainText] 我可以理解为简单地表示一个 PlainText 元素的列表,但相比之下我不明白 ’[PlainText] 的含义。
【问题讨论】:
-
这是
DataKinds扩展在工作中,允许(大致)提升类型级别的值。使用它,可以定义一种依赖于 values 的类型,而不是像往常一样依赖于其他类型。这就是字符串可以出现在那里的原因。在类型级别,[T]代表类型 list-of-T,而'[x]代表(提升的)值“列表仅包含一个元素x”。例如,甚至可以写'[x,y,z]。 -
这篇论文很好地解释了后面几节是如何实现的,没有假设太多知识,所以我建议你继续阅读:)。在阅读全文之前,我还发现 Andres Löh 的 Tiny Servant 文章是一个很好的介绍。