Q:

Pass to map two elements of the list

As I know map function takes function foo() and list and apply function foo() to each element of the list.  In the other words the parameter of foo() is the current element of the list:
*Main> map (+ 1) [0, 0, 0, 0]
[1,1,1,1]

But what if I want to apply bar() to the list where bar() have two parameters.  In the first, simple example the are current and the next parameter of the list. Something like
bar current next
  | current > next = current * 2
  | otherwise = next -2

map bar [1, 2, 3, 2, 1]

In the second, more complex example the bar() has two parameters: current element of the list and current+k element of the list. Something like:
bar shift current
  | current > next = current * 2
  | otherwise = next -2
  where next = <get current+shift element of the list>

map (bar 2) [1, 2, 3, 2, 1]

How can I do this ?
p.s. 
I am just want to rewrite this python code in Haskell:
    for i in range (w, self.k + 1):
        if vector[i] > v + vector[i - w]:
            result[i] = vector[i]
        else:
            result[i] = v + vector[i - w]

A:

You can use zipWith and drop n:
mapBar :: (Num a, Ord a) => Int -> [a] -> [a]
mapBar n list = zipWith bar list (drop n list)

