Generally, you can do
zip [0..] to iterate over a list with indices, which provides straightforward solutions to the first 3 problems. But this is not necessary for any of these exercises.
> Tell me what if I want to not apply f to all the members and say only apply it to the first 10 ?
fuse = uncurry (<>)
mapfst f n = fuse . first (map f) . splitAt n
mapfst10 = flip mapfst 10
> What if I want to start from the second and go until the next to last?
mapInner f l = fuse . second (mapfst f (len-2)) $ splitAt 1 l where len = length l
> What if I want to apply f1 when i%3 is 0, f2 when i%3 is 1 and f3 when i%3 is 2 ?
This could not be easier:
map3 f1 f2 f3 = zipWith id (cycle [f1, f2, f3])
>What if I want to go through 3 lists at once?
Literally just use zip3. Easiest thing in the world. If that is too hard for you then you're ngmi
You can also write your own zip function if you're not a retard:
myZip l1 l2 l3
| l1 ==  = 
| l2 ==  = 
| l3 ==  = 
myZip (a:as) (b:bs) (c:cs) = (a,b,c):myZip as bs cs