Haskell(带有GHC编译器)比您预期的要快得多。如果使用得当,它可以接近低级语言。(Haskellers最喜欢做的一件事是尝试在C语言的5%之内(甚至超过它,但这意味着你在使用一个低效的C程序,因为GHC将Haskell编译为C语言)。)我的问题是,为什么?

Haskell是声明性的,并且基于lambda演算。机器架构显然是必要的,大致上基于图灵机。事实上,Haskell甚至没有一个具体的评估顺序。此外,与处理机器数据类型不同,您一直都在使用代数数据类型。

最奇怪的是高阶函数。您可能会认为,动态地创建函数并将它们到处扔,会使程序变慢。但是使用高阶函数实际上使Haskell更快。实际上,为了优化Haskell代码,你需要让它更优雅和抽象,而不是更像机器。Haskell的任何高级特性如果不加以改进,似乎都不会影响它的性能。

抱歉,如果这听起来是废话,但这是我的问题:为什么Haskell(用GHC编译)这么快,考虑到它的抽象性质和与物理机器的差异?

注意:我之所以说C和其他命令式语言有点类似于图灵机(但没有到Haskell类似于Lambda Calculus的程度),是因为在命令式语言中,您有有限数量的状态(也就是行号),以及一个磁带(ram),这样状态和当前磁带就决定了对磁带做什么。关于从图灵机到计算机的转变,请参阅维基百科的条目,图灵机等价物。

我发誓曾经有一件t恤上印着不朽的文字:


哪部分

你不明白吗?


就我而言,答案是……全部!

特别是,我经常在Haskell的论文中看到这样的符号,但我不知道它的任何含义。我不知道这应该是数学的哪个分支。

我当然认得希腊字母和“结果”这样的符号(通常表示某样东西不是集合的元素)。

另一方面,我以前从未见过“⊢”(维基百科声称它可能意味着“分区”)。我也不太熟悉这里的温剂。(通常,它表示一个分数,但在这里似乎不是这样。)

如果有人至少能告诉我从哪里开始理解这些符号的海洋,那将是有帮助的。