阅读这个问题和这篇博客文章让我更加思考类型代数,特别是如何滥用它。
基本上,
1)我们可以将Either A B
类型视为加法:A+B
2)我们可以将有序对(A,B)
视为乘法:A*B
3)我们可以将函数A -> B
视为指数:B^A
这里显然有一个模式:乘法是重复的加法,指数是重复的乘法。这使得Knuth定义了上箭头 ↑ 作为指数,↑↑ 作为重复指数,↑↑↑ 作为重复的 ↑↑,以此类推。因此,10↑↑↑↑10是一个极大的数字。
我的问题是:如何在代数数据类型中表示函数↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑?看起来↑应该是带有无限数量参数的函数,但这并没有太多意义。那么A↑B
是否简单地为[A] -> B
,因此A↑↑↑↑B
将是[[[[A]]]]->B
?
如果您能解释Ackerman函数或任何其他超增长函数的样子,将获得额外的分数。
aˣ
与x->a
进行识别已经有点特例化,只是恰好在aˣ⁺ʸ
和aˣ+aʸ
以及aˣʸ
和(aˣ)ʸ
之间具有同构性。但这些同构并不完全是规范的。 - leftaroundabout