<div dir="ltr">I'm snowed under but I promise I will try to reply soon! To think about in the mean time: what do existing strict languages with pattern matching do?</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Dec 8, 2015 at 3:42 PM, Simon Peyton Jones <span dir="ltr"><<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Adam, Johan,<br>
<br>
Looking at the user manual<br>
<a href="http://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#strict-haskell" rel="noreferrer" target="_blank">http://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#strict-haskell</a>,<br>
and indeed the wiki page<br>
<a href="https://ghc.haskell.org/trac/ghc/wiki/StrictPragma" rel="noreferrer" target="_blank">https://ghc.haskell.org/trac/ghc/wiki/StrictPragma</a><br>
it's not really clear whether the sub-components of a pattern are strict.  That is, is the second equation of zip strict in x, and xs?   (Supposing for now that the list data structure is lazy).  The manual doesn't say one way or the other.<br>
<br>
What's the answer?  And could the user manual please say?<br>
<br>
Thanks<br>
<br>
Simon<br>
<div><div class="h5"><br>
| -----Original Message-----<br>
| From: ghc-devs [mailto:<a href="mailto:ghc-devs-bounces@haskell.org">ghc-devs-bounces@haskell.org</a>] On Behalf Of Ömer<br>
| Sinan Agacan<br>
| Sent: 08 December 2015 01:41<br>
| To: ghc-devs <<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
| Subject: -XStrict: Why some binders are not made strict?<br>
|<br>
| Let's say I have this code:<br>
|<br>
|     zip :: [a] -> [b] -> [(a, b)]<br>
|     zip [] [] = []<br>
|     zip (x : xs) (y : ys) = (x, y) : zip xs ys<br>
|<br>
| With -XStrict 'x', 'xs', 'y' and 'ys' don't become strict. I'm wondering<br>
| about<br>
| the motivation behind this, I found this interesting. I always thought -<br>
| XStrict<br>
| gives me this guarantee: If I'm using an already-defined variable(bound by<br>
| a<br>
| let or pattern matching) in an expression, I can be sure that the variable<br>
| won't be bottom in that expression, because it would be `seq`d before the<br>
| expression is evaluated.<br>
|<br>
| So if I have<br>
|<br>
|     case ... of<br>
|         D x y -> <body><br>
|<br>
| or<br>
|<br>
|     let x = ...<br>
|         y = ...<br>
|      in <body><br>
|<br>
| In both cases I was thinking that in <body> 'x' and 'y' can't be<br>
| bottom(with<br>
| -XStrict). This would make -XStrict programs evaluate like they would in a<br>
| call-by-value language(even though in the RTS level thunks will be built).<br>
| Variables can't range over computations; all binders evaluated strictly<br>
| etc.<br>
|<br>
| Can anyone tell me about the motivation behind this decision?<br>
|<br>
| I think the wiki page actually conflicts with itself. It says "...<br>
| bindings to be<br>
| strict by default" but then in "case expressions" sections says<br>
|<br>
|     case x of (a,b) -> rhs<br>
|<br>
|     is interpreted as<br>
|<br>
|     case x of !(a,b) -> rhs<br>
|<br>
| Here bindings 'a' and 'b' are not made strict. I'd expect something like:<br>
|<br>
|     case x of (!a,!b) -> rhs<br>
|<br>
| (Which seems to be invalid Haskell, but same effect could be achieved with<br>
| `seq<br>
| a (seq b rhs)`)<br>
|<br>
| Thanks..<br>
|<br>
| (I also realized that the wiki page doesn't mention bindings in do syntax,<br>
| is<br>
| it because this case is implied by "function definitions"? That is, bangs<br>
| are<br>
| added after do syntax is desugared and so they become strict?)<br>
| _______________________________________________<br>
| ghc-devs mailing list<br>
| <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
</div></div>| <a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.haske" rel="noreferrer" target="_blank">https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.haske</a><br>
| <a href="http://ll.org" rel="noreferrer" target="_blank">ll.org</a>%2fcgi-bin%2fmailman%2flistinfo%2fghc-<br>
| devs&data=01%7c01%7csimonpj%<a href="http://40064d.mgd.microsoft.com" rel="noreferrer" target="_blank">40064d.mgd.microsoft.com</a>%7cbc68c0830f574466efd<br>
| 308d2ff70aba9%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=c2VBbt%2f%2fR2c<br>
| yFecGEuQotO%2bV71VSbpmWnZJyV9d8KRk%3d<br>
</blockquote></div><br></div>