Sibi
Sibi

Reputation: 48644

Delete list elements by looking on another list

I have two lists. One list contains some random data and other list contains the index of first list which needs to be deleted.

For example, let us consider two lists:

let a = [3,4,5,6,6,7,8]
let b = [1,3]

Then, the resultant output should be [3,5,6,7,8]. The number 4 and 6 are deleted since they are on index positions 1 and 3 respectively.

I'm new to Haskell, so finding it difficult to find the solution.

Update: Following code makes it work

import Data.List
dele :: Eq a => [a] -> [Int] -> [a]
dele [] _ = []
dele x [] = x
dele x (y:ys) = dele (delete (x !! y) x) ys

I was just wondering, is there a way to solve it through map/fold way ?

Upvotes: 0

Views: 1790

Answers (3)

Davorak
Davorak

Reputation: 7444

An alternative answer using the lens library which has received considerable attention recently

import Control.Lens
>let a = [3,4,5,6,6,7,8]
>let b = [1,3]
>a^..elements (`notElem`b)
[3,5,6,7,8]

(^..) is jus the infix for of toListOf which can be used to traverse a structure and make a list out of its parts. The elements function just lets you choose which ones to include.

Other options are 'traverse' to traverse a traversables, 'both' to traverse a (,) and they compose together with (.) so traverse.both would traverse [(1,2), (3,4)] for example.

[(1,2), (3,4)]^..traverse.both [1,2,3,4]

Upvotes: 1

Chris Barrett
Chris Barrett

Reputation: 3375

Off the top of my head:

removeByIndex :: [Integer] -> [a] -> [a]
removeByIndex indices = map snd . filter notInIndices . zip [0..]
    where notInIndices (i,_) = i `notElem` indices

Upvotes: 2

Secoe
Secoe

Reputation: 624

deleteByIndex :: (Enum a, Eq a, Num a) => [a] -> [b] -> [b]
deleteByIndex r = map snd . filter (\(i, _) -> notElem i r) . zip [0..]

[0..] produces an infinite list [0, 1, 2, 3, ...]

zip constructs a list of pairs with the values of this list and your input list in the form [(0,x), (1, y), ...]

filter takes a function a -> Bool. The lambda checks if the index (first element of the pair) is in your input list r.

map snd returns the second element of each pair of the zip list.

zip,filter, map and notElem are documented here

Upvotes: 2

Related Questions