<span style="font-family: courier new,monospace;"><span style="font-family: arial,helvetica,sans-serif;">Thank you for your reply, I&#39;d come up with the following:</span><br><br></span><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">timed :: Int → IO a → b → IO (Either b a)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">timed max act def = do</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  r ← new</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">  </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  t ← forkIO $ do</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    a ← act</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    r ≔ Right a</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  s ← forkIO $ do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    wait max</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    e ← em r</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    case e of</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      True  → do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        kill t</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        r ≔ Left def</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">      False → return ()</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">  takeMVar r</span><br></div><br><div class="gmail_quote">---------------------<br><br><div style="margin-left: 40px;"><span style="font-family: courier new,monospace;">*Network.Port.Scan&gt; timed 500 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">Left &#39;x&#39;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">*Network.Port.Scan&gt; timed 500000 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">Right 0</span><br></div><br>---------------------<br>
<br>before reading your reply:<br><br><div style="font-family: courier new,monospace; margin-left: 40px;">timed timeout act fallback = do</div><div style="font-family: courier new,monospace; margin-left: 40px;">   res &lt;- newEmptyMVar</div>

<div style="font-family: courier new,monospace; margin-left: 40px;">   tid &lt;- forkIO $ act &gt;&gt;= writeMVar res</div><div style="font-family: courier new,monospace; margin-left: 40px;">   threadDelay timeout</div><div style="font-family: courier new,monospace; margin-left: 40px;">

   stillRunning &lt;- isEmptyMVar res</div>
<div style="font-family: courier new,monospace; margin-left: 40px;">   if stillRunning then killThread tid &gt;&gt; return fallback else takeMVar res</div><br>---------------------<br><br><div style="margin-left: 40px;">

<span style="font-family: courier new,monospace;">*Network.Port.Scan&gt; timed2 500 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&lt;interactive&gt;:1:33:</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    No instance for (Num Char)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">      arising from the literal `0&#39; at &lt;interactive&gt;:1:33</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    Possible fix: add an instance declaration for (Num Char)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    In the first argument of `return&#39;, namely `0&#39;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    In the second argument of `(&gt;&gt;)&#39;, namely `return 0&#39;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    In the second argument of `timed2&#39;, namely</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        `(wait 50000 &gt;&gt; return 0)&#39;</span><br>

</div><br>Regards,<br>Cetin Sert<br><br>2009/5/30 Sebastian Sylvan <span dir="ltr">&lt;<a href="mailto:sebastian.sylvan@gmail.com">sebastian.sylvan@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<br><br><div class="gmail_quote">2009/5/30 Cetin Sert <span dir="ltr">&lt;<a href="mailto:cetin.sert@gmail.com" target="_blank">cetin.sert@gmail.com</a>&gt;</span><div class="im"><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


Hi how could one implement a function in concurrent haskell that either returns &#39;a&#39; successfully or due timeout &#39;b&#39;?<br><br><div style="margin-left: 40px;"><span style="font-family: arial narrow,sans-serif;">timed :: Int → IO a → b → IO (Either a b)</span><br style="font-family: arial narrow,sans-serif;">




<span style="font-family: arial narrow,sans-serif;">timed max act def = do</span><br style="font-family: arial narrow,sans-serif;"></div></blockquote></div></div><div><br></div><div><br></div>Something like (warning, untested code - no compiler atm).<br>


<br><div>timed timeout act fallback = do</div><div>   res &lt;- newEmptyMVar</div><div>   tid &lt;- forkIO $ act &gt;&gt;= writeMVar res</div><div>   threadDelay timeout</div><div>   stillRunning &lt;- isEmptyMVar res</div>


<div>   if stillRunning then killThread tid &gt;&gt; return fallback else takeMVar res</div><div><br>-- <br>Sebastian Sylvan<br>+44(0)7857-300802<br>UIN: 44640862<br>
</div>
</blockquote></div><br>