为什么管道定义内部函数

时间:2015-07-01 18:15:09

标签: haskell ghc haskell-pipes

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

runEffect = go
  where
    go p = ...

或者:

pull = go
  where
    go a' = ...

或者:

reflect = go
  where
    go p = ...

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

1 个答案:

答案 0 :(得分:7)

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

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

  

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

是的,这是超级跛脚。