更灵活地处理宇宙,例如某种形式的宇宙多态性,会更好。使用案例:
- 有时需要在多个级别上使用数据类型(例如,在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):这个例子对我来说并不是人为的,我有时会这样定义“单子”。另请参见单子不一定是内函子.
关于如何解决此问题的建议:
- 添加键入规则“lift”,这样如果
x:设置
n个
,然后x:设置
(n+1)
. - 添加一种有限形式的宇宙多态性,(希望如此)这样,每个完整的程序都可以用上面的提升规则翻译成普通的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表示宇宙级上半格中的联接。