Hi!

I want to propose a new GHC extension called ListLayouts. It's basically a do-notation for pure lists and was initially meant to offer an alternative to the current do-notation monad "exploits" as seen in libraries like e.g. blaze-html, but it is of course a lot more general.

What it'd look like in practice shows this little example:

{-# LANGUAGE ListLayouts #-} import Data.Monoid main :: IO () main = mapM_ putStrLn $++ "These are list layouts." "Let me know what you think. :)" allFalse :: All allFalse = mconcat $++ All True let f = All True t = All False t f

This simply translates to (a : let b = c in (d : ... )) etc. I already started working on this extension and the above example already works:

» nils@n-sch.de. ../inplace/bin/ghc-stage2 LISTLAYOUT-TEST.hs --interactive GHCi, version 7.5.20111229: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Main ( LISTLAYOUT-TEST.hs, interpreted ) Ok, modules loaded: Main. *Main> allFalse All {getAll = False} *Main> :main These are list layouts. Let me know what you think. :) *Main>

ListLayouts currently support two statements, regular expressions (i.e. list elements) and let bindings. It could be thought to add the .. notation thing and maybe even comprehension notations, e.g.:

ex = $++ 1 2..5 x | x <- [6..], x <= 10 11 | False

This should result in the list [1,2,3,4,5,6,7,8,9,10] . Adding these features to the current existing code should be pretty much straight forward.

In my opinion this extension would fit in nicely, as it is kind of the counterpart to monad comprehensions (which practically add list notation to monads). It shouldn't be necessary to make it any more general (e.g. use monoids, semigroups or any other, potentially new, type class instead of lists) since almost every list-like datatype has it's own fromList function ( Data.Map.fromList , Data.Set.fromList , Data.Monoid.mconcat etc.) and using functions instead of class instances is a lot more convenient in most cases, too.

So please let me know what you think about this idea and whether or not you would be willing to add this extension to GHC. I would, of course, be willing to do all the coding.