<br><font size=2 face="sans-serif">rather than ask the role of $! I found
it helpful to first grasp the role of seq, since $! is defined in terms
of seq and seq is a &quot;primitive&quot; operation (no prelude definition,
like with IO, it's a &quot;given&quot;).</font>
<br>
<br><font size=2 face="sans-serif">What helped me grasp seq was its role
in a strict fold.</font>
<br>
<br><font size=2 face="sans-serif">Basically, try to sum all the numbers
from 1 to a million. Prelude &quot;sum&quot; probably gives stack overflow
(if not, up it to a billion ;) ), and so will a &nbsp;naive fold, as is
explained at</font>
<br>
<br><font size=2 face="sans-serif">http://www.haskell.org/haskellwiki/Stack_overflow</font>
<br>
<br><font size=2 face="sans-serif">The code below basically restates what
was already on the wiki, but I found my definitions of foldl' (using seq,
bang patterns, and $!) easier to understand than the definition on the
wiki page, and the definition from Data.List. (Maybe I'll edit the wiki.)</font>
<br>
<br><font size=2 face="sans-serif">t.</font>
<br>
<br><font size=2 face="Courier New">{-# LANGUAGE BangPatterns #-}</font>
<br>
<br><font size=2 face="Courier New">-- stack overflow</font>
<br><font size=2 face="Courier New">t1 = myfoldl (+) 0 [1..10^6]</font>
<br><font size=2 face="Courier New">-- works, as do myfoldl'' and myfoldl'''</font>
<br><font size=2 face="Courier New">t2 = myfoldl' (+) 0 [1..10^6] </font>
<br>
<br><font size=2 face="Courier New">-- (myfoldl f q ) is a curried function
that takes a list</font>
<br><font size=2 face="Courier New">-- If I understand currectly, in this
&quot;lazy&quot; fold, this curried function isn't applied immediately,
because </font>
<br><font size=2 face="Courier New">-- by default the value of q is still
a thunk</font>
<br><font size=2 face="Courier New">myfoldl f z [] = z</font>
<br><font size=2 face="Courier New">myfoldl f z (x:xs) = ( myfoldl f q
&nbsp;) xs</font>
<br><font size=2 face="Courier New">&nbsp; where q = z `f` x</font>
<br>
<br><font size=2 face="Courier New">-- here, because of the definition
of seq, the curried function (myfoldl' f q) is applied immediately</font>
<br><font size=2 face="Courier New">-- because the value of q is known
already, so (myfoldl' f q ) is WHNF</font>
<br><font size=2 face="Courier New">myfoldl' f z [] = z</font>
<br><font size=2 face="Courier New">myfoldl' f z (x:xs) = seq q ( myfoldl'
f q ) xs</font>
<br><font size=2 face="Courier New">&nbsp; where q = z `f` x</font>
<br>
<br><font size=2 face="Courier New">--same as myfoldl'</font>
<br><font size=2 face="Courier New">myfoldl'' f z [] = z</font>
<br><font size=2 face="Courier New">myfoldl'' f !z (x:xs) = ( myfoldl''
f q ) xs</font>
<br><font size=2 face="Courier New">&nbsp; where q = z `f` x</font>
<br>
<br><font size=2 face="Courier New">myfoldl''' f z [] = z</font>
<br><font size=2 face="Courier New">myfoldl''' f z (x:xs) = (myfoldl'''
f $! q) xs</font>
<br><font size=2 face="Courier New">&nbsp; where q = z `f` x</font>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td width=40%><font size=1 face="sans-serif"><b>PR Stanley &lt;prstanley@ntlworld.com&gt;</b>
</font>
<br><font size=1 face="sans-serif">Sent by: haskell-cafe-bounces@haskell.org</font>
<p><font size=1 face="sans-serif">11/14/2007 06:46 PM</font>
<td width=59%>
<table width=100%>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td><font size=1 face="sans-serif">haskell-cafe@haskell.org</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td><font size=1 face="sans-serif">[Haskell-cafe] What is the role of $!?</font></table>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br>
<br>
<br><tt><font size=2>Hi<br>
What is the role of $! ?<br>
As far as I can gather it's something to do with strict application. <br>
Could someone explain what it is meant by the term strict application please?<br>
Thanks,<br>
Paul<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
Haskell-Cafe@haskell.org<br>
http://www.haskell.org/mailman/listinfo/haskell-cafe<br>
</font></tt>
<br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">---</span><br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">This e-mail may contain confidential and/or privileged information. If you </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">are not the intended recipient (or have received this e-mail in error) </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">please notify the sender immediately and destroy this e-mail. Any </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">unauthorized copying, disclosure or distribution of the material in this </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">e-mail is strictly forbidden.</span><br>