141*_*653 1 optimization haskell ghc
Monoid如果我编写一个操作极其复杂的实例(<>),GHC 会知道吗?
mempty <> x = x
x <> mempty = x
Run Code Online (Sandbox Code Playgroud)
并避免计算(<>)?
我还对您如何获得该信息感兴趣,以及如果此优化不存在,这是否可以完成或之前已讨论过。
不,有几个原因。首先,您不必编写合法的半群实例。x <> y = x就编译器而言是一个有效的定义,并且它必须生成与您指定的行为相匹配的代码。所以不可能对每个Semigroup 都进行这样的优化。
GHC 通常也无法知道某个值是否等于mempty,除非通过测试它,而它只能在给定Eq实例的情况下进行测试。但它不会(==)为了避免调用您的(<>)实现而在每个 Semigroup 操作周围插入隐式测试。如果您mempty有一个特定的 Semigroup 类型,您认为在执行 的主要工作之前检查该类型会表现得更好(<>),您可以自己将其插入 Semigroup 实例中。