5

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

runEffect = go
  where
    go p = ...

或者:

pull = go
  where
    go a' = ...

或者:

reflect = go
  where
    go p = ...

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

4

1 回答 1

7

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

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

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

是的,它超级蹩脚。

于 2015-07-01T18:33:00.943 回答