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@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@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe