重写规则并让GHC中的抽象

use*_*650 14 haskell ghc

我有一个重写规则,如下所示:

{-# RULES
"modify/fusedModify" forall f g key book. modify key f (modify key g book) = fusedModify key f g book
  #-}
Run Code Online (Sandbox Code Playgroud)

在以下功能中触发:

pb :: PersonB
pb = ...

fusionB' :: PersonB
fusionB' =
  let l x = (modify #name ('c':) (modify #name ('a':) x))
  in l pb
Run Code Online (Sandbox Code Playgroud)

但是,没有让(并且可能是抽象?)它不会触发:

fusionB :: PersonB
fusionB = modify #name ('c':) (modify #name ('a':) pb)
Run Code Online (Sandbox Code Playgroud)

如果它走向另一个方向 - 也就是说,如果让抽象版本没有引起解雇,但fusionB确实如此 - 我想我明白了.可能是在特定情况下,fusedModify具有正确的类型签名,但在一般(更多态)情况下,它没有.但为什么在这个世界上我看到了这个?

对于它的价值,定义fusedModify在这里,文件与fusionBfusionB'这里.我尝试过unsafeCoercing类型均衡以使两个签名匹配(实际上,虽然GHC没有意识到它,它们总是匹配),但不知怎的,这也无济于事.

编辑:我或许应该提到我正在使用GHC 8.0.1.