【问题标题】:What does triple colon (:::) in a data type mean in haskell?数据类型中的三重冒号(:::)在haskell中意味着什么?
【发布时间】:2020-09-10 23:45:52
【问题描述】:

数据类型中的三重冒号 (:::) 在 Haskell 中是什么意思?

例如: data Term = Var ID | Atom String | Nil | Term:::Term

在这篇论文中找到https://gup.ub.gu.se/file/207634

如何使用?

例如,我可以使用foo = Var "hello",但我不知道Term:::Term 有什么用。

【问题讨论】:

  • 是数据构造函数。
  • 我在 optparse-generic 文档中发现了这个技巧

标签: haskell


【解决方案1】:

(:::) 是数据构造函数的名称。因此,您可以使用以下命令定义 Term 类型:

data Term = Var ID | Atom String | Nil | <b>(:::)</b> Term Term

就像你有 VarAtomNil 作为数据构造函数一样,(:::) 也是一个数据构造函数。此数据构造函数采用两个参数,它们都具有Term 类型。例如,列表具有 (:) 作为数据构造函数。

数据构造函数可以是一系列符号,假设这些符号以冒号 (:) 开头,并且它不是像 ::: 等保留的运算符。这在 @987654321 中指定@:

consym        →   ( : {symbol})⟨reservedop⟩
reservedop    →  .. | : | :: | = | \ | | | <- | -> |  @ | ~ | =>

【讨论】:

    【解决方案2】:

    使用 GADT 语法会更清晰吗?

    data Term :: Type where
      Var   :: ID -> Term
      Atom  :: String -> Term
      Nil   :: Term
      (:::) :: Term -> Term -> Term
    

    这些签名与:kind:type 的输出相匹配:

    >> :k Term
    Term :: *
    >> :t Var
    Var :: ID -> Term
    >> :t Atom
    Atom :: String -> Term
    >> :t Nil
    Nil :: Term
    >> :t (:::)
    (:::) :: Term -> Term -> Term
    

    【讨论】:

    • "这些签名匹配:kind:type的输出[你定义了data Term = Var ID | Atom String | Nil | Term:::Term]:"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2012-01-15
    • 2020-05-31
    相关资源
    最近更新 更多