[Haskell-cafe] Conditionals and case expressions in do blocks

Edward Amsden eca7215 at cs.rit.edu
Wed Jan 26 21:51:46 CET 2011


Those functions are useful if I'm more interested in actions (for
instance putStrLn) in IO, but they restrict the monad's return type to
().

I'm often writing code like the following:

do
...
case ... of
Foo x -> do ...
                  ...
                  return foobar
Bar x -> do ...
                 ...
                 return foobar

or worse:

if cond
  then throwError "BBQ!"
  else do
         ...
         ...
         return ...

(which works btw because throwError is polymorphic in the return type)

So I end up with a nasty set of nested do statements for case expressions.


On Wed, Jan 26, 2011 at 3:32 PM, aditya siram <aditya.siram at gmail.com> wrote:
> I think that for monads the cleanest way of doing conditional
> execution is using  'when' and 'unless' [1] and 'guard' if your type
> is a Monoid.
>
> -deech
>
> [1] http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#6
>
> On Wed, Jan 26, 2011 at 2:22 PM, Edward Amsden <eca7215 at cs.rit.edu> wrote:
>> Inside a do block, I can very conveniently substitute
>>
>> let x = <pure exp>
>> <continued monadic code>
>>
>> for either
>> x <- return <pure exp>
>> <continued monadic code>
>>
>> or
>> let x = <pure exp>
>> in do
>> <continued monadic code>
>>
>> However, I can't do anything similar (that I know of) with if or case
>> expressions. If I use if or case inside a do block, it's likely that
>> I'm still using monadic expressions (at least in my experience). Is
>> there some nasty semantic ambiguity that comes of this? Is it just not
>> in the standard yet? Is there some extension that I'm not aware of?
>>
>> --
>> Edward Amsden
>> Undergraduate
>> Computer Science
>> Rochester Institute of Technology
>> www.edwardamsden.com
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>



-- 
Edward Amsden
Undergraduate
Computer Science
Rochester Institute of Technology
www.edwardamsden.com



More information about the Haskell-Cafe mailing list