[Haskell-beginners] Padding List with Zeros

Daniel Fischer daniel.is.fischer at web.de
Wed Sep 15 10:23:49 EDT 2010


On Wednesday 15 September 2010 15:15:49, Henry Olders wrote:
> On 2010-09-14, at 19:35 , Lorenzo Isella wrote:
> > Dear All,
> > I still have to find my way with immutable lists and list
> > comprehension. Consider the following lists
> >
> > A=[0,10,20,30,40,50]
> > B=[0,10,50] (i.e. B is a subset of list A; list A is already ordered
> > in increasing order and so is B).
> > C=[2,1,-5] i.e. there is a corresponding element in C for every
> > element in B.
> >
> > Now, I would like to define a new list D having length equal to the
> > length of A. The elements of D in the position of the elements of A in
> > common with B are equal to the corresponding entries in C, whereas the
> > other ones are zero i.e.
> > D=[2,1,0,0,0,-5]. How can I achieve that? The first thought that comes
> > to my mind is to define a list of zeros which I would modify according
> > to my needs, but that is not allowed...
> > Many thanks
> >
> > Lorenzo
>
> Being a real Haskell newby, I can figure out a one-line solution in
> Python, but I don't know how to do something similar in Haskell, or even
> if it's possible. Please correct me if I'm wrong, but there does not
> seem to be a dictionary type in Haskell, and I am not aware of how to
> specify an inline if...else inside a list comprehension. I would really
> appreciate it if someone could show me how to do something similar to
> this Python statement in Haskell.
>

import Data.Maybe

> >>> A=[0,10,20,30,40,50]
> >>> B=[0,10,50]
> >>> C=[2,1,-5]

These have to be lowercase in Haskell, of course :)

> >>> [dict(zip(B,C))[a] if a in B else 0 for a in A]

map (fromMaybe 0 . (`lookup` zip b c)) a

or, as a list comprehension,

[fromMaybe 0 (lookup v dic) | let dic = zip b c, v <- a]

Slightly more verbose than the Python.

But this doesn't deal with multiple entries (istr that was mentioned 
previously in this thread), for

a = [0, 10, 10, 20, 30 , 40, 50]
b = [0, 10, 10, 50]
c = [2, 1, 3, -5]

neither would produce

[2, 1, 3, 0, 0, 0, -5]

which I believe would be the desired behaviour.

>
> [2, 1, 0, 0, 0, -5]
>
> Henry



More information about the Beginners mailing list