
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