手动将 SCC 附加到整个函数?

Manually attaching SCC to an entire function?

是否可以手动将 SCC 附加到整个函数?例如,下面如何将 SCC 附加到 f

f x = g x
  where g x = ...

如果我写

f x = {-# SCC f #-} g x y
  where g = ...
        y = ...

那么 gy 将不会包含在 SCC 中。相反,似乎我必须写

f x = {-# SCC f #-}
      let g = ...
          y = ...
      in  g x y

但这可能很烦人,因为它需要将 where 重写为 let 并将守卫重写为 case 语句。如果不进行所有这些重写,我如何才能获得相同的效果? -fprof-auto 似乎可以做到这一点。但是我只想给少数函数手动添加SCC。

这似乎在 GHC 的下一个主要版本 (8.2) 中成为可能,请参阅此票证 #12116(它显示了与您遇到的相同的解决方法和问题)。

根据 GHC 主分支的 users guide,您可以将注释放在与 f 声明相同的级别。喜欢

f x = g x y
  where g = ...
        y = ...
{-# SCC f #-}

f x = g x y
  where g = ...
        y = ...
{-# SCC f "some_cc_name" #-}