[fix #215] handle automatic projections from let pattern of tuples #216
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The issue was coming from Agda inlining let bindings. This translation leaked our encoding for tuples.
The example from #215 now gets compiled properly, but:
n-uples with n > 2 pattern-matched inside
let
s would still get compiled incorrectly because there is in fact no proper way to inline thelet
using projections (unless we also generate projections on the fly, like\(_, _, x) -> x
).So
let (x, y, z) = e in z
would still compile to the incorrectsnd (snd e)
. We probably need a reliable way to prevent such use of pattern-matching onlet
for n-uples, doesn't have to be now.We could compute the length of projection chains of
Pair.fst
andPair.snd
in the terms we get, the only issue being that the resulting error would not point to the location of thelet
, only the location of the problematic variable.The projection
fst
andsnd
ofPair
probably shouldn't get exported fromHaskell.Prim.Tuple
so as to enforce that the only way they pop up in terms is through inlining oflet
bindings.Feedback welcome.