【问题标题】:Declaring and working with Kinds in Haskell在 Haskell 中声明和使用 Kinds
【发布时间】:2015-01-11 22:59:24
【问题描述】:

我最近一直在玩 Haskell 的 -XDataKinds 功能,并且发现自己想要创建一种。

我不确定我的愿望能否实现,但从 Edward Kmett 的constraints package 看来,似乎有一个声明的类型Constraint(带有排序BOX),据说在GHC.Prim 中定义,但我找不到。

有没有办法在 Haskell 或 GHC 中手动声明一种?这可能需要手动断言使用data 声明的数据类型将是正确的类型。我的想法是这样的:

data Foo :: BOX

data Bar a :: Foo where
  Bar :: a -> Bar a

【问题讨论】:

  • DataKinds 的使用意味着每个数据声明都会创建一个新的类型,不是吗?例如data Nat = Z | S Nat 创建了一个新类型 Nat,由 Z :: NatS :: Nat -> Nat 类型居住。
  • 没错,但前提是提升的类型是正确的 Haskell98 数据类型。就我而言,我发现自己需要宣传类似于data Foo (x :: Bar) (y :: Bar) = Foo | ... 的东西,其中Bar 是一种。这不会使用-XDataKinds 进行推广 - 我需要手动 使用相同的名称进行推广。这对于想要推广 GADT 也非常有用。
  • 我已经多次阅读您的问题,但在弄清楚您需要/正在提议什么时遇到了一些麻烦。 似乎您要求声明一种新类型,其中包含一些新类型,这些新类型本身就存在于术语级别 - 目前这是不可能的。这是你要求的,还是别的什么?如果是别的东西,一个小的用例会很有启发性。至于推广 GADT,我相信这仍然是一个开放的研究问题。
  • @DanielWagner 你非常接近。我不确定是否需要术语级别的类型(如单例),但我非常想声明一种独立于其类型的类型,然后临时声明类型为先前定义的类型的居民。不清楚,我知道,但如果我可以简单地声明一个种类,然后以不同的表达式创建这种类型的居民类型,那将是理想的。我不确定我是否需要这些类型的术语,但它们也不会受到伤害。理想情况下,我想做data FooKind :: BOX where,然后是data Bar a :: FooKind where ...
  • @AthanClark 我想你是在问,除了k1 -> ... kN -> *k1 -> ... -> kM -> Constraint 之外,是否还有一种方法可以在 GHC 中声明新的开放世界类型。据我所知,答案是“不”。 GHC 中的所有其他类型都是作为(封闭)数据类型的提升而出现的。

标签: haskell dependent-type data-kinds type-kinds


【解决方案1】:

在当前的 GHC(撰写本文时为 7.8)中,不能将新种类的声明与其类型级居民的声明分开。

【讨论】:

  • 像 Agda 这样的系统有助于缓解这种需求,对吗?
  • @AthanClark 我不是 Agda 专家,我不知道它是否支持声明开放类型(在更高层)。如果是这样,我会有点惊讶。
猜你喜欢
  • 2023-03-23
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
相关资源
最近更新 更多