<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7653.38">
<TITLE>RE: [Haskell-cafe] One liner?</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Thanks, and to Ketil too. I did see past the missing &quot;./foo/&quot;. That's certainly a solution I'm happy with, and I didn't know the term eta reduction, so thanks for that too.<BR>
Paul<BR>
<BR>
<BR>
-----Original Message-----<BR>
From: Mitchell, Neil [<A HREF="mailto:neil.mitchell.2@credit-suisse.com">mailto:neil.mitchell.2@credit-suisse.com</A>]<BR>
Sent: Thu 02/10/2008 16:26<BR>
To: Paul Keir; haskell-cafe@haskell.org<BR>
Subject: RE: [Haskell-cafe] One liner?<BR>
<BR>
Hi<BR>
<BR>
You can translate this step by step.<BR>
<BR>
main = do dc &lt;- getDirectoryContents &quot;./foo/&quot;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapM_ putStrLn dc<BR>
<BR>
Translating out the do notation<BR>
(http://www.haskell.org/haskellwiki/Keywords#do):<BR>
<BR>
main = getDirectoryContents &gt;&gt;= \dc -&gt;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapM_ putStrLn dc<BR>
<BR>
Then we can chop out the dc argument, as its \x -&gt; .... x, and can be<BR>
removed (eta reduction):<BR>
<BR>
main = getDirectoryContents &gt;&gt;=<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapM_ putStrLn<BR>
<BR>
And finally we just remove the newline:<BR>
<BR>
main = getDirectoryContents &gt;&gt;= mapM_ putStrLn&nbsp;<BR>
<BR>
Alternatively, we can flip the &gt;&gt;= for =&lt;&lt; and write:<BR>
<BR>
main = mapM_ putStrLn =&lt;&lt; getDirectoryContents<BR>
<BR>
This is now one line, and mirrors how you would write the function if it<BR>
was pure using function composition.<BR>
<BR>
Thanks<BR>
<BR>
Neil<BR>
<BR>
<BR>
This material is sales and trading commentary and does not constitute<BR>
investment research. Please follow the attached hyperlink to an<BR>
important disclaimer<BR>
&lt;www.credit-suisse.com/emea/legal<BR>
&lt;outbind://31/www.credit-suisse.com/emea/legal&gt; &gt;<BR>
<BR>
<BR>
<BR>
<BR>
________________________________<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; From: haskell-cafe-bounces@haskell.org<BR>
[<A HREF="mailto:haskell-cafe-bounces@haskell.org">mailto:haskell-cafe-bounces@haskell.org</A>] On Behalf Of Paul Keir<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sent: 02 October 2008 4:20 pm<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; To: haskell-cafe@haskell.org<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subject: [Haskell-cafe] One liner?<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hi all,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There's a common little situation I keep bumping up against. I<BR>
don't understand where I'm going wrong, so I've made a little example.<BR>
It's to do with binding a result to a variable name using &quot;&lt;-&quot;. This<BR>
code works fine:<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------------------------------<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; module Main where<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import System.Directory (getDirectoryContents)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; main = do dc &lt;- getDirectoryContents &quot;./foo/&quot;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapM_ putStrLn dc<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------------------------------<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; But if I try to avoid the use of the bind to &quot;dc&quot;, I fail:<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------------------------------<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapM_ putStrLn (getDirectoryContents &quot;./foo/&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------------------------------<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I've tried using map instead of mapM_, and inserted &quot;return&quot;s<BR>
here and there, but no luck. Can anyone tell me where and why I'm going<BR>
wrong? The error message is below.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cheers,<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paul<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Couldn't match expected type `[String]'<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; against inferred type `IO [FilePath]'<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; In the second argument of `mapM_', namely<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; `(getDirectoryContents &quot;./foo/&quot;)'<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; In the expression: mapM_ putStrLn (getDirectoryContents<BR>
&quot;./foo/&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; In the definition of `main':<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; main = mapM_ putStrLn (getDirectoryContents &quot;./foo/&quot;)<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
<BR>
<BR>
==============================================================================<BR>
Please access the attached hyperlink for an important electronic communications disclaimer:<BR>
<BR>
<A HREF="http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html">http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html</A><BR>
==============================================================================<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>