通过this question和this blog post阅读让我更多地考虑类型代数,特别是如何滥用它。
基本上,
1)我们可以将Either A B
类型视为加法:A+B
2)我们可以将有序对(A,B)
视为乘法:A*B
3)我们可以将函数A -> B
视为取幂:B^A
这里有一个明显的模式:乘法重复加法,并且取幂重复乘法。这导致Knuth to define the up arrow↑作为取幂,↑↑作为重复取幂,↑↑↑作为重复↑↑,依此类推。因此,10↑↑↑↑10是一个巨大的数字。
我的问题是:如何在代数数据中表示函数↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
类型?似乎↑应该是一个具有无限数量参数的函数,但这并没有多大意义。 A↑B
只是[A] -> B
,因此A↑↑↑↑B
是[[[[A]]]]->B
吗?
如果您可以解释Ackerman function的外观或任何其他hypergrowth functions的内容,则可获得奖励积分。
答案 0 :(得分:8)
在最明显的级别,您可以使用
识别↑↑b((...(a -> a) -> ...) -> a) -- iterated b times
和↑↑↑b只是
(a↑↑(a↑↑(...(a↑↑(a↑↑a))...))) -- iterated b times
所以一切都可以用一些长函数类型来表达(因此一些非常长的元组类型......)。但是我不认为对于熟悉的Haskell类型(基本上使用...
或↑
)的(基数),任意向上箭头符号都有一个方便的表达式,因为我我不能想到任何常见的数学对象,它们对基础集的大小具有大于指数的组合依赖性(没有去太大的递归数据类型)...也许在组合集理论中有一些这样的对象? (你的问题似乎[对我而言]更多关于集合的大小而不是类型的任何特定内容。)
(Wikipedia page you linked已将这些对象连接到Ackermann函数。)