6

查看Haskell Servant 包,有一个将 Web 服务 API 定义为的初始示例:

             -- GET /date
type MyAPI = "date" :> Get '[JSON] Date
             -- GET /time/:tz
        :<|> "time" :> Capture "tz" Timezone :> Get '[JSON] Time

我无法理解这意味着什么,希望能得到以下解释:

  1. :>并且:<|>是中缀构造函数。这种类型声明是否意味着它们是在这里定义的还是在这里使用的?或者也许:>在这里定义但:<|>在其他地方定义?或者是其他东西?不知道如何阅读这种类型。

  2. 是什么'[JSON]?这是某种类型级别的文字列表吗?报价单有什么作用?

4

2 回答 2

5

这里使用了(中缀)构造函数,它们必须在datanewtype声明的其他地方定义。type声明永远不会产生任何类型的构造函数。

'[JSON]确实是一个类型级别的列表,相当于JSON ': '[]. 单引号表示数据构造函数被提升为类型构造函数。我不确定这有什么深刻的意义,但至少它避免了数据构造函数和类型构造函数可以共享名称这一事实可能引起的混淆。

于 2015-10-29T05:26:54.717 回答
2

仅作记录,这里是 和 的实际:<|>定义:>

-- 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

后者没有任何构造函数,因为我们在将请求处理程序组合在一起时不需要它,而:<|>当我们在值级别将多个请求处理程序粘合在一起时,我们正在重用该符号,而不是将几个描述放在一起类型级别的端点,我们也使用:<|>运算符。但是在后一种情况下,我们引用了:<|>-the-type-constructor,而当我们在处理程序上使用它时,我们引用了:<|>-the-data-constructor。

于 2015-10-29T11:26:39.933 回答