[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