我知道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]
答案 0 :(得分:6)
您可以使用zipWith
和drop n
:
mapBar :: (Num a, Ord a) => Int -> [a] -> [a]
mapBar n list = zipWith bar list (drop n list)