了解 Haskell 类型级别文字

Understanding Haskell Type Level Literals

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

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

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

  1. :>:<|> 是中缀构造函数。这个类型声明是指它们在这里定义还是在这里使用?还是这里定义了 :> 但别处定义了 :<|>?或者是其他东西?不确定如何阅读此类型。

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

这里使用了 (infix) 构造函数,它们必须在 datanewtype 声明中的其他地方定义。 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

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