Подтвердить что ты не робот

Перепишите правила и дайте абстракцию в GHC

У меня есть правило перезаписи, которое выглядит так:

{-# RULES
"modify/fusedModify" forall f g key book. modify key f (modify key g book) = fusedModify key f g book
  #-}

Что срабатывает в следующей функции:

pb :: PersonB
pb = ...

fusionB' :: PersonB
fusionB' =
  let l x = (modify #name ('c':) (modify #name ('a':) x))
  in l pb

Однако, без let (и предположительно let-abstraction?), он не срабатывает:

fusionB :: PersonB
fusionB = modify #name ('c':) (modify #name ('a':) pb)

Если это пошло иначе, то есть, если версия let-abstracted не вызвала увольнения, но fusionB сделала - я думаю, что я пойму. Может быть, в конкретном случае fusedModify имеет правильную сигнатуру типа, но в общем (более полиморфном) случае это не так. Но почему в мире я вижу это?

Для того, что стоит, определение fusedModify здесь, а файл с fusionB и fusionB' равен здесь. Я пробовал равенства типа unsafeCoercing, чтобы получить подписи обеих подписи (на самом деле, хотя GHC этого не понимает, они всегда совпадают), но так или иначе это тоже не помогает.

EDIT: Возможно, я должен упомянуть, что использую GHC 8.0.1.

4b9b3361