[Haskell-cafe] Creating a list with do notation

Lyndon Maydwell maydwell at gmail.com
Fri Jan 23 04:28:23 UTC 2015


The items in your do-block must be in the same monad as you're operating in
- in this example - the list monad:

main = do
  x <- return $ do
    [ 1 ]
    [ 2 ]
    [ 3 ]
  print (x :: [Int])


Unfortunately, there is no accumulation of items. You can reason this out
if you desugar the do-notation into binds:

[ 1 ] >> [ 2 ] >> [ 3 ]

[ 1 ] >>= (\x -> [ 2 ] >>= (\y -> [ 3 ]))

and then examine the list Monad instance.


You can achieve something similar to what you're looking for with the
writer monad:

import Control.Monad.Writer.Lazy

main = do
  x <- return $ execWriter $ do
    tell [1]
    tell [2]
    tell [3]
  print (x :: [Int])



On Fri, Jan 23, 2015 at 3:04 PM, Cody Goodman <codygman.consulting at gmail.com
> wrote:

> List is a monad, does that mean i can create a list with do notation?
>
> My intuition led me to believe this would work:
>
> main = do
>   x <- return $ do
>     1
>     2
>     3
>   print (x :: [Int])
>
>
> However it didn't. Is this possible?
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20150123/8fa6d49e/attachment.html>


More information about the Haskell-Cafe mailing list