<div>f `unamb` g just needs f or g to be in <span class="Apple-style-span" style="font-style: italic;">weak</span> head normal form I think. This should be much easier to test for I guess.</div><div><br></div><div>I always confuse weak head normal form with reduced head normal form, but the documentation of GHC does not help here:<br>
</div><div><br></div><div>E.g.:</div><div></div><div><span class="Apple-style-span" style="font-family: -webkit-sans-serif; font-size: 16px; "><span class="Apple-style-span" style="font-family: &#39;times new roman&#39;; "><pre>
<span class="comment" style="color: green; ">-- | Reduces its argument to <span class="Apple-style-span" style="font-weight: bold;">weak head normal form</span>.</span>
<a name="line-178"></a><span class="definition">rwhnf</span> <span class="keyglyph" style="color: red; ">::</span> <span class="conid">Strategy</span> <span class="varid">a</span> 
<a name="line-179"></a><span class="definition">rwhnf</span> <span class="varid">x</span> <span class="keyglyph" style="color: red; ">=</span> <span class="varid">x</span> <span class="varop">`<span class="Apple-style-span" style="font-weight: bold;">seq</span>`</span> <span class="conid">()</span>  </pre>
<pre><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;">but the documentation of seq says</span></pre><pre><span class="Apple-style-span" style="font-family: -webkit-sans-serif; white-space: normal; "><table class="vanilla" cellspacing="0" cellpadding="0" style="width: 100%; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; ">
<tbody><tr><td class="topdecl" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; background-color: rgb(240, 240, 240); font-family: monospace; vertical-align: top; ">
<table class="declbar" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><tbody><tr><td class="declname" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; width: 100%; ">
<b>seq</b> :: a -&gt; b -&gt; b</td><td class="declbut" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; padding-left: 5px; padding-right: 5px; border-left-width: 1px; border-left-color: rgb(0, 0, 153); border-left-style: solid; white-space: nowrap; font-size: small; ">
<a href="file:///C:/app/ghc-6.10.2/doc/libraries/ghc-prim/src/GHC-Prim.html#seq" style="color: rgb(0, 0, 224); text-decoration: none; ">Source</a></td></tr></tbody></table></td></tr><tr><td class="doc" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 2px; padding-left: 10px; ">
Evaluates its first argument to <span class="Apple-style-span" style="font-weight: bold;">head normal form</span>, and then returns its second argument as the result.<br><br></td></tr></tbody></table></span></pre><pre><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;">Furthermore:</span></pre>
<pre><span class="Apple-style-span" style="font-family: -webkit-sans-serif; white-space: normal; "><table class="vanilla" cellspacing="0" cellpadding="0" style="width: 100%; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; ">
<tbody><tr><td class="topdecl" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px; background-color: rgb(240, 240, 240); font-family: monospace; vertical-align: top; ">
<table class="declbar" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; "><tbody><tr><td class="declname" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; width: 100%; ">
<a name="v:rnf"></a><a name="v%3Arnf"></a><b>rnf</b> :: <a href="file:///C:/app/ghc-6.10.2/doc/libraries/parallel/Control-Parallel-Strategies.html#t%3AStrategy" style="color: rgb(0, 0, 224); text-decoration: none; ">Strategy</a> a</td>
<td class="declbut" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; padding-left: 5px; padding-right: 5px; border-left-width: 1px; border-left-color: rgb(0, 0, 153); border-left-style: solid; white-space: nowrap; font-size: small; ">
<a href="file:///C:/app/ghc-6.10.2/doc/libraries/parallel/src/Control-Parallel-Strategies.html#rnf" style="color: rgb(0, 0, 224); text-decoration: none; ">Source</a></td></tr></tbody></table></td></tr><tr><td class="doc" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 2px; padding-left: 10px; ">
Reduces its argument to <span class="Apple-style-span" style="font-weight: bold;">(head) normal form</span>.<br><br></td></tr></tbody></table><span class="Apple-style-span" style="font-family: arial; font-size: 13px; ">So from the documentation rnf should be like seq, but it is not, rnf is a &quot;deep seq&quot;. </span></span></pre>
<pre><span class="Apple-style-span" style="font-family: arial; font-size: 13px; white-space: normal;">I find this very confusing. Is the documentation of seq wrong (should be <span class="Apple-style-span" style="font-style: italic;">weak</span> head normal form)?</span></pre>
</span></span></div><div>Anyway, so I guess we would actually need a function:</div><div><br></div><div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: large;">iswhnf  :: a -&gt; IO Bool</span></span></div>
<div><br></div></div><div><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: small;">But since the value of this </span></span><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: small;">iswhnf function d</span></span><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: small;">epends on </span></span><span class="Apple-style-span" style="font-style: italic; "><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: small;">when</span></span></span><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: small;"> it is called, I feel it has to be in the IO monad; actually multiple threads evaluating it have nothing to do with it?</span></span></div>
<div><br></div><div><br></div><div><div class="gmail_quote">On Mon, Apr 20, 2009 at 10:05 PM, Jake McArthur <span dir="ltr">&lt;<a href="mailto:jake.mcarthur@gmail.com">jake.mcarthur@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">Christopher Lane Hinson wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
What we&#39;d like to avoid is duplicate verification that a thunk is hnf. Do we have evidence that this verification ever actually consumes a lot of resources?<br>
</blockquote>
<br></div>
I think the OP is trying to avoid spawning unnecessary threads at the cost of duplicate checks for HNF.<br><font color="#888888">
<br>
- Jake<br>
</font></blockquote></div><br></div>