【问题标题】:Understanding Haskell Type Level Literals了解 Haskell 类型级别文字
【发布时间】:2015-10-30 02:43:51
【问题描述】:

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

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

我无法理解这意味着什么,希望对以下内容作出解释:

  1. :&gt;:&lt;|&gt; 是中缀构造函数。这种类型声明是指它们是在这里定义的还是在这里使用的?或者,:&gt; 是在这里定义的,而 :&lt;|&gt; 是在其他地方定义的?或者是其他东西?不知道如何阅读这种类型。

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

【问题讨论】:

    标签: haskell types infix-operator


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。关于类型级文字的 GHC 文档对列表只字未提。你知道这是在哪里定义的吗?
    • @Ana 所有可升级数据类型的类型级别版本在使用DataKinds 扩展时会自动定义。 See here for details.
    【解决方案2】:

    为了记录,这里是:&lt;|&gt;:&gt;的实际定义。

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 2016-06-01
      • 2014-04-15
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多