我正在尝试创建一个接受函数作为参数的函数,并将该函数应用于列表中的每对元素。例如,如果我调用我的函数foldPairs
,那么我会这样使用它:
foldPairs (+) [1..10]
[3,7,11,15,19]
我在尝试中尝试使用foldl
...
foldPairs :: (a->a->a) -> [a] -> [a]
foldPairs func lis = foldl func lis
然而,这显然不起作用。我想我可能不得不使用curried
和uncurried
,但我不太清楚如何。有人可以帮助我吗?
答案 0 :(得分:2)
假设,对于奇数编号的输入列表,我们只丢弃最后一个元素,以下内容将执行所需的操作:
foldPairs :: (a->a->a) -> [a] -> [a]
foldPairs _ [] = []
foldPairs _ [_] = []
foldPairs f (x:y:xs) = f x y : foldPairs f xs
答案 1 :(得分:0)
我要使用的解决方案是将[1..10]
转换为[[1,2],[3,4],[5,6],[7,8],[9,10]]
,然后过滤掉任何长度为1的列表,转换为元组,然后映射您的函数:
chunks :: Int -> [a] -> [[a]]
chunks n = reverse . go []
where
go acc [] = acc
go acc xs =
let (h, t) = splitAt n xs
in go (h:acc) t
然后简单地
foldpairs :: (a -> a -> b) -> [a] -> [b]
foldpairs f
= map (uncurry f)
. map (\[x, y] -> (x, y))
. filter ((== 2) . length)
. chunks 2