查看 Haskell Servant 包,有一个将 Web 服务 API 定义为的初始示例:
-- GET /date
type MyAPI = "date" :> Get '[JSON] Date
-- GET /time/:tz
:<|> "time" :> Capture "tz" Timezone :> Get '[JSON] Time
我无法理解这意味着什么,并希望对以下内容进行解释:
:>
和:<|>
是中缀构造函数。此类型声明是否意味着它们在此处定义或在此处使用?或者也许:>
在这里定义,但:<|>
其他地方定义?还是别的什么?不知道如何阅读此类型。什么是
'[JSON]
?这是某种类型级文本列表吗?报价有什么作用?
此处使用(中缀(构造函数,它们必须在data
或newtype
声明中的其他位置定义。 type
声明永远不会生成任何类型的构造函数。
'[JSON]
确实是一个类型级别列表,相当于JSON ': '[]
。单引号指示数据构造函数正在提升为类型构造函数。我不确定这有什么深刻的意义,但至少它避免了因数据构造函数和类型构造函数可以共享名称这一事实而可能引起的混淆。
仅供记录,以下是:<|>
和:>
的实际定义。
-- that's really like a pair of an 'a' and a 'b'...
-- that can be chained in a nice way, as opposed to nested pairs.
data a :<|> b = a :<|> b
data a :> b
后者没有任何构造函数,因为我们在将请求处理程序组合在一起时不需要它,而当我们在值级别将多个请求处理程序粘合在一起时,我们正在重用:<|>
符号,而不是在类型级别将多个终结点的描述放在一起,我们还使用 :<|>
运算符。但在后一种情况下,我们引用:<|>
类型构造函数,而当我们在处理程序上使用它时,我们引用:<|>
数据构造函数。