宇宙多态性

更灵活地处理宇宙,例如某种形式的宇宙多态性,会更好。使用案例:

  • 有时需要在多个级别上使用数据类型(例如,在Set和Set1级别上都相等)。或者可能需要在多个级别上使用函数(如合成)。这些不同的使用可能发生在同一程序中。
  • 有时需要在多个级别上使用数据类型在同一表达式中示例:monad的深度嵌入以及连接操作。
data Monad(a:集合):集合1,其中返回:a->Monad a_>>=_:{b:集合}->Monad b->(b->Monad a)->Monad a加入:forall{a}->Monad(Monad a)->Monad a连接x=x>>=y->y
的类型签名参加打字不好,因为莫纳德a不住在设置.
注释(Wolfram):然而,这个示例是人为的,至少因为单子应该是内幕-函子。,莫纳德a应该是与.
回应(NAD):这个例子对我来说并不是人为的,我有时会这样定义“单子”。另请参见单子不一定是内函子.

关于如何解决此问题的建议:

  1. 添加键入规则“lift”,这样如果x:设置n个,然后x:设置(n+1).
  2. 添加一种有限形式的宇宙多态性,(希望如此)这样,每个完整的程序都可以用上面的提升规则翻译成普通的Agda。初步草图:
    • 让我们(暂时)介绍一种宇宙级别的类型,水平以及将其提升到下一个级别的操作。然后可以显式地编写(某些)universe多态操作。
    • 然而,生成的系统可能太强大了,所以我们限制它,只允许每个定义使用一个最外层的量词(即不允许使用更高秩的宇宙多态性)。
    • 此外,用户不允许手动写出这个量词。相反,我们推断出它。上面的Monad声明概括如下:
      data Monad{i:Level}(a:Set i):集合(i+1),其中返回:a->Monad a_>>=_:{b:集合i}->Monad b->(b->Monad a)->Monad a
      基本上所有的用途设置成为设置i,设置1成为集合(i+1)等。
    • 通用多态性定义的使用会对索引产生某些约束。必须能够仅使用lift类型规则解决这些约束。可能有几种可能的解决方案;我们选择指数最低的那一个。(注:我们不主张存在主要解决方案。)例如,对于的类型签名参加我们首先推断出一个通用变体,如下所示:
      对于所有{i}{a:Set i}->Monad{?1}(Monad{?2}a)->Monard{?3}a,
      这里我们得到了一些约束,?1 ≥ ?2 + 1,?2≥i?3≥i此外,所有问号都必须用表单的表达式解决(在进行类型检查之前,在本地解决)i+k(输入+输出)对于常量自然数k个。我们得到“最低”的解决方案?1=i+1,?2=i,?3=i.
      另一个示例:对于联接{i}{a}x我们得到了广义右手边
      _>>=_{i=?1}{a=a}{b=单子{i=±2}a}x个(\(y:Monad{i=?3}a)->y:Monad{i=±4}a)
      具有约束条件{x≥i|i∈?1,?2,?3,?4},?1 ≥ ?2 + 1。我们得到了“最低”的解决方案?1=i+1,?2 = ?3 = ?4=i(这有点简化,因为实际上b条首先必须通过统一等进行推断。)

上面概述的系统可能不够强大,但至少它解决了一些问题,非常简单,并且提供了一个测试平台,我们可以测试它的局限性。我们不应该在没有动机良好的用例的情况下扩展语言。


从范畴理论的角度来看,连接操作比绑定操作更原始,我想知道

data Monad{i:Level}(a:Set i):集合(i+1),其中返回:a->Monad a_>>=_:{b:集合i}->Monad b->(b->Monad a)->Monad a

可能看起来像。我现在能想到的只有签名

data Monad{i:Level}(a:Set i):设置(最大i c),其中返回:a->Monad a_>>=_:{b:集合i}->Monad b->(b->Monad a)->Monad a

对于某些常数级c,其中max表示宇宙级上半格中的联接。

页面上次修改时间:2009年12月27日下午04:10
技术支持私人维基