【发布时间】:2011-12-01 21:23:46
【问题描述】:
在 System F 中,我可以使用 Church 数字定义真正的总加法函数。
在 Haskell 中,由于底部值,我无法定义该函数。例如,在 haskell 中,如果 x + y = x,那么我不能说 y 为零 - 如果 x 是底部,对于任何 y,x + y = x。所以加法不是真正的加法,而是它的近似值。
在 C 中我无法定义该函数,因为 C 规范要求所有内容都具有有限的大小。所以在 C 中可能的近似值甚至比在 Haskell 中更糟糕。
所以我们有:
在 System F 中可以定义加法,但不可能有完整的实现(因为没有无限的硬件)。
在 Haskell 中无法定义加法(因为底部),也不可能有完整的实现。
在 C 语言中,不可能定义总加法函数(因为所有事物的语义都是有界的),但兼容的实现是可能的。
因此,所有 3 个正式系统(Haskell、System F 和 C)似乎都有不同的设计权衡。
那么选择一个而不是另一个的后果是什么?
【问题讨论】:
-
如果不是“没有无限的硬件”,那么“C 规范要求一切都具有有限的大小”是什么意思? C 确实将动态分配的内存块限制为小于
pow(2, 8 * sizeof(size_t))字节,但如果您的硬件有足够的内存,您可以将它们链接起来。 -
System F Turing 完成了吗?如果是这样,我认为您无法避免
x + y = x问题,因为y可以无限递归。 -
@Owen:系统 F 不是图灵完备的;有很多方法可以编码一些复杂的递归程序,但它仍然是强规范化
-
@acfoltzer 在这种情况下,我会说这是一个重大的权衡;)
-
@MikeSamuel 我不能无限链接这些,因为指针大小是固定的。所以我不能将 C 中的任意整数表示为任意长度的链表——语义总是施加限制。相比之下,SystemF 或 Haskell 的语义没有指定限制。
标签: haskell types language-design turing-complete