[Haskell-cafe] One liner?

Bulat Ziganshin bulat.ziganshin at gmail.com
Thu Oct 2 11:37:14 EDT 2008


Hello Neil,

Thursday, October 2, 2008, 7:26:23 PM, you wrote:

shortly speaking, getDirectoryContents is an action (having
"IO a" type) while second mapM_ argument should be a value returned by
this action. by using dc variable or >>= operator, you can evaluate
action and pass its result to mapM_. of course, after imperative
languages experience, it's hard to see difference. take look at
http://haskell.org/haskellwiki/IO_inside


> Hi
>  
> You can translate this step by step.
>  
> main = do dc <- getDirectoryContents "./foo/"
>           mapM_ putStrLn dc

> Translating out the do notation
> (http://www.haskell.org/haskellwiki/Keywords#do):

> main = getDirectoryContents >>= \dc ->
>        mapM_ putStrLn dc

> Then we can chop out the dc argument, as its \x -> .... x, and can be
> removed (eta reduction):

> main = getDirectoryContents >>= 
>        mapM_ putStrLn

> And finally we just remove the newline:

> main = getDirectoryContents >>= mapM_ putStrLn  

> Alternatively, we can flip the >>= for =<< and write:

> main = mapM_ putStrLn =<< getDirectoryContents

> This is now one line, and mirrors how you would write the function if it
> was pure using function composition.

> Thanks

> Neil
>  

> This material is sales and trading commentary and does not constitute
> investment research. Please follow the attached hyperlink to an
> important disclaimer 
> <www.credit-suisse.com/emea/legal
> <outbind://31/www.credit-suisse.com/emea/legal> > 

>  


> ________________________________

>         From: haskell-cafe-bounces at haskell.org
> [mailto:haskell-cafe-bounces at haskell.org] On Behalf Of Paul Keir
>         Sent: 02 October 2008 4:20 pm
>         To: haskell-cafe at haskell.org
>         Subject: [Haskell-cafe] One liner?
>         
>         

>         Hi all,
>         
>         There's a common little situation I keep bumping up against. I
> don't understand where I'm going wrong, so I've made a little example.
> It's to do with binding a result to a variable name using "<-". This
> code works fine:
>         
>         ----------------------------------------------
>         module Main where
>         
>         import System.Directory (getDirectoryContents)
>         
>         main = do dc <- getDirectoryContents "./foo/"
>                   mapM_ putStrLn dc
>         ----------------------------------------------
>         
>         But if I try to avoid the use of the bind to "dc", I fail:
>         
>         ----------------------------------------------
>         mapM_ putStrLn (getDirectoryContents "./foo/")
>         ----------------------------------------------
>         
>         I've tried using map instead of mapM_, and inserted "return"s
> here and there, but no luck. Can anyone tell me where and why I'm going
> wrong? The error message is below.
>         
>         Cheers,
>         Paul
>         
>         
>         Couldn't match expected type `[String]'
>                against inferred type `IO [FilePath]'
>         In the second argument of `mapM_', namely
>             `(getDirectoryContents "./foo/")'
>         In the expression: mapM_ putStrLn (getDirectoryContents
> "./foo/")
>         In the definition of `main':
>             main = mapM_ putStrLn (getDirectoryContents "./foo/")
>         


> ==============================================================================
> Please access the attached hyperlink for an important electronic communications disclaimer:

> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
> ==============================================================================

> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



-- 
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com



More information about the Haskell-Cafe mailing list