通读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的外观,将获得加分。

最佳答案

在最明显的水平上,您可以使用

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

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

因此,一切都可以用某种长函数类型来表达(因此就像某些长元组类型……)。但是我不认为就熟悉的Haskell类型(除了上面用...编写的类型)的(基数)而言,没有一个方便的向上箭头符号的表达方式,因为我无法想到任何常见的数学公式对基础集的大小具有大于指数的组合依赖关系的对象(不使用递归数据类型,后者太大)...组合集理论中也许有一些这样的对象? (在我看来,您的问题似乎更多地是关于集合的大小,而不是关于类型的任何东西。)

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

关于haskell - 输入代数和Knuth的向上箭头表示法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13170803/

10-11 01:35