Haskell-a function 在列表上应用一个函数

Haskell-a function that applies a function on a list

我正在尝试创建一个接受函数作为参数的函数,并将该函数应用于列表中的每一对元素。例如,如果我调用我的函数 foldPairs,那么我会这样使用它:

foldPairs (+) [1..10]

[3,7,11,15,19]

我在尝试中尝试使用 foldl...

foldPairs :: (a->a->a) -> [a] -> [a]
foldPairs func lis = foldl func lis

但这显然行不通。我想我可能必须使用 currieduncurried 但我不太确定如何使用。有人可以帮我吗?

假设,对于一个奇数编号的输入列表,我们只丢弃最后一个元素,以下将执行所需的操作:

foldPairs :: (a->a->a) -> [a] -> [a]
foldPairs _ [] = []
foldPairs _ [_] = []
foldPairs f (x:y:xs) = f x y : foldPairs f xs

我会采用的解决方案是将 [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