理解Haskell类型级别文字

时间:2015-10-29 04:58:47

标签: haskell types infix-operator

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

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

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

  1. :>:<|>是中缀构造函数。此类型声明是否表示它们是在此处定义的还是在此处使用?或者这里定义了:>,但:<|>在其他地方定义了?或者是其他东西?不知道如何阅读此类型。

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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

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