
On Friday 10 September 2010 16:55:43, Lorenzo Isella wrote:
Dear All, I know this must be a one-liner, but it am banging my head against the wall. I am trying my hands at list manipulation in Haskell and a lot of useful function are making my life easier but I cannot achieve something really simple. Let us say you have the lists ml and sel
ml=[23,44,55,8,98] and sel=[1,2] .
Now, I would like simply to get a new list whose entries are the elements of ml in position sel.
Simple but potentially very inefficient: map (ml !!) sel resp. map (genericIndex ml) sel As long as all elements of sel are small, that's okay, but imagine sel = [k*10^6 | k <- [1 .. 10]] or worse, sel = [10^6 + k | k <- [0, 3 .. 1000]] If sel is increasing, selection :: Integral a => [a] -> [b] -> [b] selection sel = pick distances where distances = zipWith (-) sel (0:sel) pick [] _ = [] pick (d:ds) xs = case genericDrop d xs of [] -> [] ys@(y:_) -> y : pick ds ys *Select> selection [1,1,7,9,12,12,20] [0 .. 16] [1,1,7,9,12,12] *Select> selection [1,1,7,9,12,12,20] [0 .. 1000] [1,1,7,9,12,12,20] If sel is not increasing, an efficient solution is more complex.
In my case things might be a little more complicated because all the elements are Integer and not Int (I noticed that sometimes this means I have to resort to generic functions). Cheers
Lorenzo