У меня есть правило перезаписи, которое выглядит так:
{-# 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.