Haskell 类型代数与Knuth';s向上箭头符号
通过阅读,我对类型代数有了更多的思考,特别是如何滥用它 基本上 1) 我们可以将Haskell 类型代数与Knuth';s向上箭头符号,haskell,types,functional-programming,algebraic-data-types,Haskell,Types,Functional Programming,Algebraic Data Types,通过阅读,我对类型代数有了更多的思考,特别是如何滥用它 基本上 1) 我们可以将A B类型视为加法:A+B 2) 我们可以把有序对(A,B)看作乘法:A*B 3) 我们可以把函数A->B看作是求幂:B^A 这里有一个明显的模式:乘法是重复加法,而幂运算是重复乘法。这导致↑ 作为指数运算,↑↑ 作为重复的指数运算,↑↑↑ 重复↑↑, 等等因此,10↑↑↑↑10是一个巨大的数字 我的问题是:该如何发挥作用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 用代数数据表示 类型?好像↑ 应该是一个具有无穷多个参数的
A B
类型视为加法:A+B
2) 我们可以把有序对(A,B)
看作乘法:A*B
3) 我们可以把函数A->B
看作是求幂:B^A
这里有一个明显的模式:乘法是重复加法,而幂运算是重复乘法。这导致↑ 作为指数运算,↑↑ 作为重复的指数运算,↑↑↑ 重复↑↑, 等等因此,10↑↑↑↑10是一个巨大的数字
我的问题是:该如何发挥作用↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 用代数数据表示
类型?好像↑ 应该是一个具有无穷多个参数的函数,但这没有多大意义。将A↑B
就是[A]->B
,因此A↑↑↑↑B
be[[[A]]]->B
如果你能解释它是什么样子,或者其他任何一个样子,你就可以得到额外的分数。在最明显的层次上,你可以识别一个↑↑b与
((...(a -> a) -> ...) -> a) -- iterated b times
和↑↑↑b只是
(a↑↑(a↑↑(...(a↑↑(a↑↑a))...))) -- iterated b times
因此,一切都可以用一些长函数类型来表示(因此可以用一些非常长的元组类型…)。但我认为,对于熟悉的Haskell类型(除了上面用…
或编写的类型之外),任意向上箭头符号(基数)没有一个方便的表达式↑代码>),因为我想不出任何常见的数学对象对基础集的大小具有大于指数的组合依赖性(不去递归数据类型,它们太大了)。。。也许在组合集合论中有一些这样的对象?(在我看来,你的问题更多的是关于集合的大小,而不是特定于类型的任何东西。)
(已将这些对象连接到Ackermann函数。)我认为这不能以真正规范的方式完成。用x->a
识别aˣ
已经有点特别了,只是碰巧aˣ之间有同构⁺ʸ
和aˣ+aʸ
以及aˣ
和(aˣ)ʸ
。但这些同构并不完全是规范的。