键入代数和Knuth的向上箭头表示法

时间:2012-11-01 04:06:00

标签: haskell types functional-programming algebraic-data-types

通过this questionthis 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的内容,则可获得奖励积分。

1 个答案:

答案 0 :(得分:8)

在最明显的级别,您可以使用

识别↑↑b
((...(a -> a) -> ...) -> a)  -- iterated b times

和↑↑↑b只是

(a↑↑(a↑↑(...(a↑↑(a↑↑a))...))) -- iterated b times

所以一切都可以用一些长函数类型来表达(因此一些非常长的元组类型......)。但是我不认为对于熟悉的Haskell类型(基本上使用...)的(基数),任意向上箭头符号都有一个方便的表达式,因为我我不能想到任何常见的数学对象,它们对基础集的大小具有大于指数的组合依赖性(没有去太大的递归数据类型)...也许在组合集理论中有一些这样的对象? (你的问题似乎[对我而言]更多关于集合的大小而不是类型的任何特定内容。)

Wikipedia page you linked已将这些对象连接到Ackermann函数。)