[Haskell-cafe] Re: Problems interpreting

Jón Fairbairn jon.fairbairn at cl.cam.ac.uk
Mon Sep 18 07:42:59 EDT 2006

Andrea Rossato <mailing_list at istitutocolli.org> writes:

> On Mon, Sep 18, 2006 at 04:16:55AM -0700, Carajillu wrote:
> > 
> > Wow! I'm starting to love this languaje, and the people who uses it!:)
> > 
> You spoke too early. My code had a bug, a huge one...
> this is the right one:
> -- Replaces a wildcard in a list with the list given as the third argument
> substitute :: Eq a => a -> [a] -> [a] -> [a]
> substitute e l1 l2= [c | c <- check_elem l1]
>     where check_elem [] = l1
>           check_elem (x:xs) = if x == e then (l2 ++ xs) else [x] ++ check_elem xs

I think it's nicer to do it like this:

   substitute e l l'
       = concat (map subst_elem l)
         where subst_elem x
                   | x == e = l'
                   | otherwise = [x]

since "subst_elem" has a more straightforward meaning than
"check_elem", and the concatenation is handled by a well
known standard function.

Also, it would usually be more useful to have the argument
to replace /with/ before the argument to replace /in/, so
that ("substitute '*' "wurble") is a function that replaces
all the '*'s in it's argument with "wurble"s.

And if you do that, you can write it like this:

   subst e l'
       = concat . map subst_elem
         where subst_elem x
                   | x == e = l'
                   | otherwise = [x]

Jón Fairbairn                                 Jon.Fairbairn at cl.cam.ac.uk

More information about the Haskell-Cafe mailing list