haskell – 类型代数和Knuth的向上箭头符号

阅读this questionthis blog post让我想到更多关于类型代数,特别是如何滥用它。

基本上,

1)我们可以将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

在最明显的水平上,您可以识别↑↑b

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

而↑↑↑b只是

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

所以一切都可以用一些很长的函数类型来表示(因为一些非常长的元组类型)。但是,我不认为有一个方便的表达方式,就是使用熟悉的Haskell类型(超出上面的…或↑)的(基数)的任意向上箭头符号,因为我不能想到任何具有大于指数的组合依赖性的通用数学对象对底层集合的大小(不转移到过大的递归数据类型)…或许在组合集理论中有一些这样的对象? (你的问题似乎更多的关于集合的大小比任何特定的类型。)

(Wikipedia page you linked已将这些对象连接到Ackermann功能。)

http://stackoverflow.com/questions/13170803/type-algebra-and-knuths-up-arrow-notation

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:haskell – 类型代数和Knuth的向上箭头符号