FWIW here is another solution, using only lists. (Whereas I agree with others who suggested using *proper* data structures rather than 'lists for everything') -- walks over both lists, always consumes an element from -- the first list, consumes an element from the second list -- only if values are equal. ix :: Ord a => [a] -> [a] -> [b -> Maybe b] ix (a:as) (b:bs) | a == b = Just : ix as bs ix (a:as) (b:bs) | a < b = const Nothing : ix as (b:bs) ix _ _ = [] -- consume a value from the second list, only if the current -- function coming from the first list evaluates to a Just proj :: [a -> Maybe b] -> [a] -> [Maybe b] proj [] _ = [] proj (f:fs) (x:xs) = let fx = f x nextxs Nothing = x : xs nextxs _ = xs in fx : proj fs (nextxs fx) *Main> proj (ix inp_a inp_b) inp_c [Just 2,Just 1,Nothing,Nothing,Nothing,Just (-5)] And of course, if you really want to substitute 0's for Nothings, you can do it using something like: to0s :: Num a => [Maybe a] -> [a] to0s = map (fromMaybe 0) *Main> to0s $ proj (ix inp_a inp_b) inp_c [2,1,0,0,0,-5] Hope this helps, Ozgur On 15 September 2010 00:35, Lorenzo Isella <lorenzo.isella@gmail.com> 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 _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners