Skip to content

Fix bogus worker for newtypes

Simon Peyton Jones requested to merge wip/T16191 into master

The "worker" for a newtype is actually a function with a small (compulsory) unfolding, namely a cast.

But the construction of this function was plain wrong for newtype /instances/; it cast the arguemnt to the family type rather than the representation type.

This never actually bit us because, in the case of a family instance, we immediately cast the result to the family type. So we get \x. (x |> co1) |> co2

where the compositio of co1 and co2 is ill-kinded. However the optimiser (even the simple optimiser) just collapsed those casts, ignoring the mis-match in the middle, so we never saw the problem.

Trac #16191 (closed) is indeed a dup of #16141 (closed); but the resaon these tickets produce Lint errors is not the unnecessary forcing; it's because of the ill-typed casts.

This patch fixes the ill-typed casts, properly. I can't see a way to trigger an actual failure prior to this patch, but it's still wrong wrong wrong to have ill-typed casts, so better to get rid of them.

Merge request reports