限制数据类型促销的动机

Dou*_*ean 12 haskell ghc data-kinds

任何人都可以解释或猜测GHC用户指南7.9.2节中讨论的数据类型提升限制背后的动机吗?

以下限制适用于促销:

  • 我们只提升其种类为表单的数据类型* -> ... -> * -> *.特别是,我们不会推广更高级的数据类型,例如data Fix f = In (f (Fix f)),其类型涉及提升类型的数据类型,例如Vec :: * -> Nat -> *.

特别是,我对最后一点关于推广类型感兴趣,比如Vec :: * -> Nat -> *.推广这样的类似似乎很自然.我试图将我的一个库转换成各种幻像类型的特定提升类型,而不是使用kind *用于所有内容,以提供更好的文档等,我很快就遇到了它.

通常情况下编译器限制的原因会引起一些思考,但我没有看到这一点.所以我想知道它是否属于"不需要,所以我们没有建立它"或"那是不可能的/不可判断的/破坏推理".

pig*_*ker 20

如果您提升由提升类型索引的类型,则会发生一件有趣的事情.想象一下,我们建立

data Nat = Ze | Su Nat
Run Code Online (Sandbox Code Playgroud)

然后

data Vec :: Nat -> * -> * where
  VNil   :: Vec Ze x
  VCons  :: x -> Vec n x -> Vec (Su n) x
Run Code Online (Sandbox Code Playgroud)

在幕后,构造函数的内部类型通过约束表示实例化的返回索引,就像我们编写的那样

data Vec (n :: Nat) (a :: *)
  =            n ~ Ze    => VNil
  | forall k.  n ~ Su k  => VCons a (Vec k a)
Run Code Online (Sandbox Code Playgroud)

现在,如果我们被允许的话

data Elem :: forall n a. a -> Vec n a -> * where
  Top :: Elem x (VCons x xs)
  Pop :: Elem x xs -> Elem x (VCons y xs)
Run Code Online (Sandbox Code Playgroud)

内部形式的翻译必须是这样的

data Elem (x :: a) (zs :: Vec n a)
  = forall (k :: Nat), (xs :: Vec k a).            (n ~ Su k, zs ~ VCons x xs) =>
      Top
  | forall (k :: Nat), (xs :: Vec k s), (y :: a).  (n ~ Su k, zs ~ VCons y xs) =>
      Pop (Elem x xs)
Run Code Online (Sandbox Code Playgroud)

但是看看每种情况下的第二个约束!我们有

zs :: Vec n a
Run Code Online (Sandbox Code Playgroud)

VCons x xs, VCons y xs :: Vec (Su k) a
Run Code Online (Sandbox Code Playgroud)

但是在那时定义的系统FC中,等式约束必须在两侧都有相同类型的类型,所以这个例子并不是一个小问题.

一个修复是使用第一个约束的证据来修复第二个约束,但是我们需要依赖约束

(q1 :: n ~ Su k, zs |> q1 ~ VCons x xs)
Run Code Online (Sandbox Code Playgroud)

另一种解决办法就是允许异构方程式,就像我十五年前在依赖型理论中所做的那样.事物之间不可避免地存在方程式,它们的种类相同,在语法上并不明显.

这是后一个目前受到青睐的计划.据我了解,您提到的政策被采纳为持有立场,直到具有异质平等的核心语言(由Weirich及其同事提出)的设计已经成熟到实施.我们生活在有趣的时代.

  • 干杯! GADT是引入等式约束的主要场所,但它们有时也会出现在实例声明中.有一个技巧,你做的事情,如`instance(x~p,C t)=> C(x - > t)`强制比'实例C t => C(p - > t)`更积极的承诺.我敢打赌异类平等也会出现在那种事物中. (2认同)