【发布时间】:2021-03-31 02:52:22
【问题描述】:
如何将函数应用于列表的两个元素。例如:
给定列表[red,star,blue,oval,orange,hexagon]我想将函数应用于每一对functionName(red,star)functionName(blue,oval)functionName(orange,hexagon)
我猜我必须使用递归。
【问题讨论】:
如何将函数应用于列表的两个元素。例如:
给定列表[red,star,blue,oval,orange,hexagon]我想将函数应用于每一对functionName(red,star)functionName(blue,oval)functionName(orange,hexagon)
我猜我必须使用递归。
【问题讨论】:
是的,方法是定义一个递归函数 - 如果输入列表的项目数不均匀,您需要考虑(以及我们不知道的)应该发生什么? 当然,您希望如何收集该函数的结果?
假设您只是忽略不均匀列表中的最后一个元素,并且您希望将结果收集到另一个列表中:
applyPairwise :: (a -> a -> b) -> [a] -> [b]
applyPairwise f (a1 : a2 : rest) = f a1 a2 : applyPairwise f rest
applyPairwise _ _ = []
例子:
> applyPairwise (+) [1..5]
[3,7]
【讨论】:
补充 Carsten 的回答,有时在函数式编程(或一般编程)中,您可能希望将要执行的任务分成几个子任务。所以这里有两个任务:
对于第一个任务,我们可以简单地定义一个函数pairing,它执行以下操作(并且还假设您要忽略空列表或单例列表):
pairing :: [a] -> [(a,a)]
pairing [] = []
pairing [x] = []
pairing (x:y:xs) = (x,y) : pairing xs
例如:
pairing [] == []
pairing [1] == []
pairing [1,2,3,4] == [(1,2),(3,4)]
pairing [1,2,3,4,5] == [(1,2),(3,4)]
那么对于任务 2,Haskell 中有一个操作将函数应用于称为 map 的元素列表(这些将函数作为参数的函数称为高阶函数):
例如:
f x = x^2
map f [0,1,2] == [0,1,4]
所以我们现在可以像这样实现函数applyPairwise:
applyPairwise :: ((a,a) -> b) -> [a] -> [b]
applyPairwise f xs = map f (pairing xs)
甚至更好地使用组合:
applyPairwise f = map f . pairing
【讨论】: