#4370: Bring back monad comprehensions
---------------------------------+------------------------------------------
Reporter: simonpj | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 6.12.3
Keywords: | Testcase:
Blockedby: | Difficulty:
Os: Unknown/Multiple | Blocking:
Architecture: Unknown/Multiple | Failure: None/Unknown
---------------------------------+------------------------------------------
Changes (by simonpj):
* cc: giorgi...@… (added)
Comment:
Max replies:
> One can also look at how recently introduced 'order by' and 'group by'
> constructs generalise to monad comprehensions. If that works, one
> could implement even more "stylish" monad comprehension notation.
They do: see the comments by Michael Adams at
http://haskell.org/haskellwiki/Simonpj/Talk:ListComp. Last I checked, the
code there was slightly buggy but correct in spirit.
What ''doesn't'' generalise is the zip comprehensions extension:
{{{
[(x, y) | x <- xs | y <- ys] == zip xs ys
}}}
The required operator :: `m a -> m b -> m (a, b)` is that of the !ZipList
applicative functor, not that of the standard applicative functor for
lists. Probably to generalise this you need a new typeclass like this one
(copied from my own library):
{{{
class Functor z => Zippable z where
-- Naturality:
-- fmap (first f) (zip_ as bs) == zip_ (fmap f as) bs
-- fmap (second f) (zip_ as bs) == zip_ as (fmap f bs)
--
-- Information preservation:
-- fmap fst (zip_ as bs) == as
-- fmap snd (zip_ as bs) == bs
zip_ :: z a -> z b -> z (a, b)
zip_ = zipWith_ (,)
zipWith_ :: (a -> b -> c) -> z a -> z b -> z c
zipWith_ f as bs = fmap (uncurry f) (zip_ as bs)
}}}
It probably needs some extra laws to say how it interacts with the Monad
operators.
> * Do you think that it would be hard to integrate this extension into
> current GHC codebase?
Pretty easy IMHO. The list comprehensions are already half-set up for this
job, and you should be able to reuse lots of the code that handles the
monad notation desugaring.
> * Have you already thought about how to generalise 'order by' and
> 'group by' to monad comprehensions?
See above.
> * Have you already thought about how to address the original objections
to
> the monad comprehension notation?
I thought it was rejected because it caused newbies to get confusing type
error messages: they expected *list* error messages but got errors
mentioning a scary *Monad* thing. Personally I'm not sure how to solve
that, but if it's only available as an extension this won't cause a
problem.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4370#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs