通读这个问题和这篇博文让我对类型代数有了更多的思考,特别是如何滥用它。
基本上,
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