【问题标题】:Haskell Weird Kinds: Kind of (->) is ?? -> ? -> *Haskell Weird Kinds: Kind of (->) is ?? ->? -> *
【发布时间】:2023-03-23 14:55:01
【问题描述】:

当我尝试使用 Haskell 类型并尝试获得 -> 类型时,结果出现了:

$ ghci
...
Prelude> :k (->)
(->) :: ?? -> ? -> *
Prelude> 

而不是预期的* -> * -> *??? 是什么?它们是指具体类型还是“种类变量”?还是别的什么?

【问题讨论】:

  • 这个问题现在是历史问题。从 GHC 7.4 开始,(->) 的类型现在只是* -> * -> *,即使启用了PolyKinds

标签: haskell types type-systems


【解决方案1】:

这些是 Haskell 类系统的特定于 GHC 的扩展。 Haskell 98 报告specifies only a simple kind system

... 类型表达式被分类 分成不同的种类,其中一种 两种可能的形式:

符号*代表种类 所有空类型构造函数。如果 k1 和 k2 是种类,那么 k1->k2 是 一种类型的类型 k1 并返回类型 k2。

GHC extends this system 带有一种类型的子类型,允许unboxed types,并允许函数构造器在类型上是多态的。格GHC支持的种类有:

             ?
             /\
            /  \
          ??   (#)
          / \     
         *   #     

Where:       *   [LiftedTypeKind]   means boxed type
             #   [UnliftedTypeKind] means unboxed type
            (#)  [UbxTupleKind]     means unboxed tuple
            ??   [ArgTypeKind]      is the lub of {*, #}
            ?    [OpenTypeKind]     means any type at all

ghc/compiler/types/Type.lhs中定义

特别是:

> error :: forall a:?. String -> a
> (->)  :: ?? -> ? -> *
> (\\(x::t) -> ...)

在最后一个示例中的位置t :: ??(即不是未装箱的元组)。所以,引用 GHC 的话,“在种类层面有一点子类型化”。

对于感兴趣的灵魂,GHC 还支持在 GADT、新类型和类型族中使用的强制类型和种类(“作为类型相等性证据的类型级术语”,System Fc 需要)。

【讨论】:

  • 这一切都令人兴奋 - 是否存在用户(与编译器实现者相反)可能关心/需要明确利用这些装箱/未装箱类型区别的情况?从表面上看,它们似乎有点像一些用于编译器内部优化的内部推理机制的抽象泄漏?
  • 如果您尝试编写使用除 '*' 以外的类型的函数,您会很在意——因为它们对您的组合方式有各种限制。
  • 在我看来,这也像是一个抽象泄漏。编程语言是关于向开发人员公开正确的抽象级别。我认为这是一个深入的层次。
  • 在新的 GHC 中,(?)(??) 被重命名为 OpenKindArgKind,现在是 (->) :: * -> * -> *haskell.org/pipermail/glasgow-haskell-users/2012-June/…
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2022-12-27
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多