Haskell - 一个在列表中应用函数的函数

时间:2015-03-03 17:19:19

标签: haskell

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

foldPairs (+) [1..10]

[3,7,11,15,19]

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

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

然而,这显然不起作用。我想我可能不得不使用currieduncurried,但我不太清楚如何。有人可以帮助我吗?

2 个答案:

答案 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