<div dir="ltr"><br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Rafael Gustavo da Cunha Pereira Pinto</b> <span dir="ltr">&lt;<a href="mailto:rafaelgcpp@gmail.com">rafaelgcpp@gmail.com</a>&gt;</span><br>
Date: Mon, Sep 22, 2008 at 15:46<br>Subject: Re: [Haskell-cafe] hGetContents and lazyness<br>To: Max Vasin &lt;<a href="mailto:max.vasin@gmail.com">max.vasin@gmail.com</a>&gt;<br><br><br><div dir="ltr">Why don&#39;t you use OpenFile?<br>
<br>&gt; getPackageList packageFile = do <br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h &lt;- OpenFile packageFile ReadMode<div class="Ih2E3d"><br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; c &lt;- hGetContents h<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; return $ map (drop 10) $ filter (startsWith &quot;Filename:&quot;) $ lines c<br><br></div>I am not at home so I don&#39;t have GHC around here, but this usually works for me!<br><br>Anyway, it also depends on who is consuming the IO [FilePath] data returned. It will not be evaluated unless asked for! <br>
<div><div></div><div class="Wj3C7c">
<br><br><div class="gmail_quote">On Mon, Sep 22, 2008 at 14:52, Max Vasin <span dir="ltr">&lt;<a href="mailto:max.vasin@gmail.com" target="_blank">max.vasin@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Hello, haskellers!<br>
<br>
Suppose we have function (it filters package filenames from apt Packages file):<br>
<br>
&gt; getPackageList :: FilePath -&gt; IO [FilePath]<br>
&gt; getPackageList packageFile = withFile packageFile ReadMode $<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\h -&gt; do c &lt;- hGetContents h<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return $ map (drop 10) $ filter (startsWith &quot;Filename:&quot;) $ lines c -- (1)<br>
&gt; &nbsp; &nbsp; where startsWith [] _ = True<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; startsWith _ [] = False<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; startsWith (x:xs) (y:ys) | x == y &nbsp; &nbsp;= startsWith xs ys<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| otherwise = False<br>
<br>
When, I apply it to a Packages file I (surely) get an empty list. This is an expected result due to<br>
lazyness of hGetContents. I tried changing line (1) to<br>
<br>
&gt; return $ map (drop 10) $ filter (startsWith &quot;Filename:&quot;) $! lines c<br>
<br>
or<br>
<br>
&gt; return $ map (drop 10) $! filter (startsWith &quot;Filename:&quot;) $! lines c<br>
<br>
with no success.<br>
<br>
Chaning it to<br>
<br>
&gt; return $! map (drop 10) $ filter (startsWith &quot;Filename:&quot;) $ lines c<br>
<br>
makes getPackageList function return several (but not all) filenames.<br>
<br>
What I&#39;m missing? And how can I fix my code?<br>
<font color="#888888"><br>
--<br>
WBR,<br>
Max Vasin.<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</font></blockquote></div><br><br clear="all"><br></div></div>-- <br>Rafael Gustavo da Cunha Pereira Pinto<br>Electronic Engineer, MSc.<br>
</div>
</div><br><br clear="all"><br>-- <br>Rafael Gustavo da Cunha Pereira Pinto<br>Electronic Engineer, MSc.<br>
</div>