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
但这显然行不通。我想我可能必须使用 curried
和 uncurried
但我不太确定如何使用。有人可以帮我吗?
假设,对于一个奇数编号的输入列表,我们只丢弃最后一个元素,以下将执行所需的操作:
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
我正在尝试创建一个接受函数作为参数的函数,并将该函数应用于列表中的每一对元素。例如,如果我调用我的函数 foldPairs
,那么我会这样使用它:
foldPairs (+) [1..10]
[3,7,11,15,19]
我在尝试中尝试使用 foldl
...
foldPairs :: (a->a->a) -> [a] -> [a]
foldPairs func lis = foldl func lis
但这显然行不通。我想我可能必须使用 curried
和 uncurried
但我不太确定如何使用。有人可以帮我吗?
假设,对于一个奇数编号的输入列表,我们只丢弃最后一个元素,以下将执行所需的操作:
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