Personal tools


From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(select in utility-ht)
Line 21: Line 21:
Unfortunately this function is not in the [[Prelude]].
Unfortunately this function is not in the [[Prelude]].
It is however in the [ utility-ht] package.
Alternative implementations are
Alternative implementations are

Revision as of 23:16, 7 January 2009


1 Question

Can I have a
where the alternatives contain expressions?

2 Answer

There are several approaches to this problem.

2.1 Using functions

We can do this nicely with a function implemented in Haskell:

select :: a -> [(Bool, a)] -> a
select def = maybe def snd . List.find fst
select exDefault
    [(cond1, ex1),
     (cond2, ex2),
     (cond3, ex3)]

Unfortunately this function is not in the Prelude. It is however in the utility-ht package.

Alternative implementations are

select' def = fromMaybe def . lookup True
{- a purely functional implementation of if-then-else -}
if' :: Bool -> a -> a -> a
if' True  x _ = x
if' False _ y = y
select'' = foldr (uncurry if')
The implementation of
makes clear that
can be considered as nested
s. The functional
is also useful in connection with
zipWith3 if'
merges two lists according to a list of conditions.

See if-then-else.

Alternatively you can unroll
and write
if' cond1 ex1 $
if' cond2 ex2 $
if' cond3 ex3 $
If you use
in infix form, you may call it
like in C,

then because of partial application it will work nicely together with '$' for the else clause.

infixl 1 ?
(?) :: Bool -> a -> a -> a
(?) = if'
cond1 ? ex1 $
cond2 ? ex2 $
cond3 ? ex3 $

2.2 Using syntactic sugar

2.2.1 Guards

You can make use of some syntactic sugar of Haskell, namely of guards.

case () of _
             | cond1     -> ex1
             | cond2     -> ex2
             | cond3     -> ex3
             | otherwise -> exDefault

Alternatively, one could simply factor out a function(/value) and use guards in the argument patterns.

2.2.2 List comprehensions

An alternative sugarful approach is to use list comprehensions.

head $
  [ ex1 | cond1 ] ++
  [ ex2 | cond2 ] ++
  [ ex3 | cond3 ] ++
  [ exDefault ]