[Haskell] Re: Mixing monadic and non-monadic functions

Lyle Kopnicky lists at qseep.net
Wed Sep 14 23:36:08 EDT 2005


It appears to me that:

* Many people don't like having to "extract values" from a monad on a 
separate line, but would like to be able to mix monadic return values 
into pure expressions, on the way to calculating a monadic result.

* Some people want to fix this by doing an implicit lifting operation on 
functions, when their parameters are monadic

* It is not really clear what values are "monadic" and which aren't, so 
the implicit lifting is a guessing game, and likely to produce 
confounding errors.

* If you aren't going to be precise about what's in the monad and what's 
not, you might as well use ML.

I propose instead an explicit, lightweight notation, with a simple 
rewrite rule.  Instead of:

do
    putStr "What is your name? "
    s <- getLine
    putStrLn ("Hello " ++ s)

I would like to write something like:

do
    putStr "What is your name? "
    putStrLn ("Hello " ++ {* getLine *})

In other words, we use some kind of special brackets (I don't care what) 
to indicate that this value needs to be extracted from the monad on a 
previous line, and inserted back here as a "pure" value.  If these occur 
multiply nested, they can be flattened out according to a dependency 
rule.  E.g.,

do
    m1 {* m2 {* m3 *} v4 *} {* m5 *}

...would be rewritten as...

do
    v3 <- m3
    v2 <- m2 v3 v4
    v5 <- m5
    m1 v2 v5

...and...

do
    m1 {* {* m2 *} *}

...would become...

do
    m2a <- m2
    v2 <- m2a
    m1 v2

I'm sure this has been suggested before... but what do folks think?

- Lyle


More information about the Haskell mailing list