传递映射列表的两个元素

时间:2014-03-16 15:03:42

标签: haskell

我知道map函数接受函数foo()并列出并将函数foo()应用于列表的每个元素。换句话说,foo()的参数是列表的当前元素:

*Main> map (+ 1) [0, 0, 0, 0]
[1,1,1,1]

但是,如果我想将bar()应用于bar()有两个参数的列表,该怎么办?在第一个简单示例中,列表的当前和下一个参数。像

这样的东西
bar current next
  | current > next = current * 2
  | otherwise = next -2

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

在第二个更复杂的例子中,bar()有两个参数:列表的当前元素和列表的当前+ k元素。类似的东西:

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]

我该怎么做?

P.S。

我只是想在Haskell中重写这个python代码:

    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]

1 个答案:

答案 0 :(得分:6)

您可以使用zipWithdrop n

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