[Haskell] No Pattern Guards

Claus Reinke claus.reinke at talk21.com
Mon Mar 28 10:03:02 EST 2005


> Now generalize it to more than two cases, or one where the second case
> needs to pattern match too. The magic of pattern guards is not in a
> single guarding expression, but in a function with many different cases
> which use pattern guards.

MonadPlus is your friend, especially if (fail s) is mzero. I tend to use
something like the following "design pattern" to "lift" pattern match 
failure/case handling into the expression world:

import Data.Maybe
import Control.Monad

clunky' env vars = fromJust $

  do (var1:var2:vars) <- return vars
     val1 <- lookup var1 env
     val2 <- lookup var2 env
     return (val1 + val2)

   `mplus`

   do [var1] <- return vars
      -- .. some stuff ..
      return 1
   
   `mplus`

   do [] <- return vars
      -- .. more stuff ..
      return 2

--
*Main> let env=[(1,5),(2,7)]
*Main> clunky' env [1,2]
12
*Main> clunky' env [0]
1
*Main> clunky' env []
2

Very handy for syntax-oriented programming and if combined
with non-deterministic state transformers, as in parsers, type 
systems and the like.

cheers,
claus




More information about the Haskell mailing list