Assuming the indexes are sorted, you can write your own explicit recursion.
search :: [Int] -> [a] -> [a]
search indices xs = go indices 0 xs -- start from index 0
where
go :: [Int] -> Int -> [a] -> [a]
-- no more indices, we are done
go [] _ _ = []
-- more indices but no more elements -> error
go _ _ [] = error "index not found"
-- if the wanted index i is the same as the current index j,
-- return the current element y, more to the next wanted index
go (i:is) j yys@(y:_) | i==j = y : go is j yys
-- otherwise, skip y and increment the current index j
go iis j (_:ys) = go iis (j+1) ys
Higher-level approaches exist, but this should be a basic effective alternative. It works in O (n), where n is the length of the lists.
, !! O (n ^ 2), !! O (n).
, go (sort indices) 0 xs. O (n log n).