管道定义内部函数的原因

Emm*_*ery 5 haskell ghc haskell-pipes

我正在查看管道库的源代码,例如在Core模块中,我不明白为什么作者到处都是使用定义函数的模式:

runEffect = go
  where
    go p = ...
Run Code Online (Sandbox Code Playgroud)

要么:

pull = go
  where
    go a' = ...
Run Code Online (Sandbox Code Playgroud)

要么:

reflect = go
  where
    go p = ...
Run Code Online (Sandbox Code Playgroud)

这是一些启用某些优化的技巧吗?我发现它很难看,如果它是一些优化技巧我真的希望编译器可以在没有这样的情况下做到这一点.但也许还有另一个原因?

jbe*_*man 7

GHC只会内联非递归函数,并且只有当它们从语法的角度"完全应用"时(即在调用站点,它们才会应用于定义中左侧出现的参数数量).

在您发布的示例中没有参数,但是定义可能是递归的,不会内联.进行此转换可能允许m在呼叫站点内联和专门(针对具体类型等)定义.

这是一些启用某些优化的技巧吗?我发现它很难看,如果它是一些优化技巧我真的希望编译器可以在没有这样的情况下做到这一点.

是的,这是超级跛脚.

  • `pipes`是一个带有可组合抽象的小型库,可用于构建大量复杂的逻辑,因此在核心库级别进行大量优化是很自然的.它也有重要的重写规则.相反,在正常的生产代码中,我们不需要关心手动工作包装器.GHC通常做得很好. (2认同)