<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Right now, there is one rule: if the type of any variable bound in the
pattern is unlifted, then the pattern is an unlifter-var pattern and is
strict.</div></blockquote><div> </div><div>I think the intuition I followed so far was "bindings with unlifted *RHS* are strict".</div></div></blockquote><div><br></div><div> This is a very different rule indeed! And one which gives a strict semantic to the initial offender.</div><div><br></div><div>But there are holes in it: if I `let (x, y) = blah in …` and `x` is at an unlifted type, the pattern _needs_ to be strict (this is solved by the current rule as described by Richard) despite the rhs being at a lifted type. That's because binding `x` forces the pattern anyway, by definition. There are questions about nested patterns, as well. What about `let (U x, y) = blah in …`, where `U` is some unlifted type. Is the nested `U x` pattern strict? or is it lazy? There is no corresponding right-hand side.</div><div><br></div><div>This is all a tad tricky, I must say.<br></div></div></div>