我在努力 超级组合者 是:

SuperCombinator是一个常数,或者是仅包含超级表达式的组合器。

还有什么 恒定的应用形式 是:

任何不是Lambda抽象的超级组合器。这包括真正的恒定表达式,例如12,(+)1 2),[1,2,3]以及部分应用的函数,例如((+)4)。请注意,在ETA抽象下,最后一个示例等于 x->(+)4 x,这不是CAF。

这对我来说没有任何意义!不是 ((+) 4) 就像12一样“真正的恒定”?在我的简单头脑中,CAFS听起来像是价值观。

有帮助吗?

解决方案

您参考的这些Haskell Wiki页面是旧的,我认为不幸的是写了。尤其不幸的是,他们混合了CAF和超级计算机。超级训练者很有趣,但与GHC无关。 CAF仍然是GHC的一部分,并且无需参考超级竞争者就可以理解。


所以让我们从 超级计算机. 。组合者衍生 组合逻辑, ,在这里的用法中,由仅应用一种或另一种形式传递给对方的值的函数组成 - 即他们结合了他们的论点。最著名的组合者是 S,K和我, ,这是图灵完整的。在这种情况下,超级计算机是仅由传递的值,组合者和其他超级竞争者构建的函数。因此,可以通过替换将任何超级计算机扩展到普通的旧组合器中。

一些用于功能语言的编译器(不是GHC!)使用组合器和超级计算机作为编译中的中间步骤。与任何类似的编译器技术一样,这样做的原因是接受优化分析,这些分析更容易以如此简化的最小语言进行。埃德温·布雷迪(Edwin Brady) 史诗.


恒定的应用形式 完全是其他东西。他们有点微妙,并且有一些陷阱。思考它们的方法是编译器实施的一个方面,没有单独的语义含义,而是对运行时性能产生深远影响。以下可能不是对CAF的完美描述,但它会试图传达我对什么的直觉,因为我还没有看到一个 真的 很好的描述在其他任何地方都可以供我下船。这 GHC评论Wiki中的清洁“权威”描述 读如下:

恒定的应用表格或简称CAF是程序中定义的顶级值。从本质上讲,它们是在运行时不会动态分配的对象,而是程序的静态数据的一部分。

那是一个好的开始。从某种意义上说,纯净,功能性,懒惰的语言可以将其视为降低机器。您第一次要求节点的值迫使其评估,从而依次要求子节点的值等。一个节点是评估的,结果值却持续了(尽管它没有 坚持下去 - 因为这是一种纯粹的语言,我们总是可以保持子节点的生存和重新计算,而没有语义效果)。 CAF确实只是一个价值。但是,在上下文中,一种特殊的价值 - 编译器可以确定的价值完全取决于其子节点。也就是说:

foo x = ...
  where thisIsACaf = [1..10::Int]

        thisIsNotACaf = [1..x::Int]
        thisIsAlsoNotACaf :: Num a => [a]
        thisIsAlsoNotACaf = [1..10] -- oops, polymorphic! the "num" dictionary is implicitly a parameter.

        thisCouldBeACaf = const [1..10::Int] x -- requires a sufficiently smart compiler
        thisAlsoCouldBeACaf _ = [1..10::Int] -- also requires a sufficiently smart compiler

那么,为什么我们要关心什么是CAFS?基本上是因为有时候我们真的真的不想重新计算某些东西(例如,令人难以置信的!),因此要确保它得到正确的共享。其他时候我们真的 想要重新计算某些东西(例如,一个易于生成的巨大无聊的清单(例如Naturals),我们只是走过来),并且不会永远留在记忆中。命名事物并将它们结合在莱特或编写内联的情况下,等等。通常让我们以自然,直观的方式指定这些事物。但是,有时候,编译器比我们预期的要聪明或笨拙,而且我们认为只有一旦被重新计算才能计算出来,或者我们不想悬挂的东西作为CAF被提升。然后,我们需要更仔细地思考事物。请参阅此讨论,以了解有关涉及的一些棘手的想法: 避免“分享”的好方法?

顺便说一句,我不喜欢它,但是任何想要随意取得如此多的答案的人,他们想尝试将其与现有的Haskell Wiki页面集成在一起并改进/更新它们

其他提示

马特是正确的,因为定义令人困惑。这甚至是矛盾的。 CAF定义为:

任何不是Lambda抽象的超级组合器。这包括真正恒定的表达 12, ((+) 1 2), [1,2,3] 以及部分应用功能,例如 ((+) 4).

因此, ((+) 4) 被视为CAF。但是在下一句话中,我们被告知这等同于不是CAF的东西:

最后一个示例是在ETA抽象下等效的 \ x -> (+) 4 x 这不是CAF。

基于它们等同于lambda抽象的理由排除部分应用功能将是更干净的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top