首页 > 解决方案 > Haskell - 检查位置是否是偶数/奇数

问题描述

我需要做的是在列表中交替应用 2 个函数。例如:

(*2) (-3) [4,5,6,7,8]

会导致

[8,2,12,4,16], 因为4*2, 5-3, 6*2, 7-3, 8*2...

我在想的是

funct :: (a -> b) -> (a -> b) -> [a] -> [b]

然后像

[f x | x <- xs]但是我不会只有“ f”,但也会有其他功能。

所以我在考虑检查 的位置x。如果它是一个偶数位置,那么f x。否则g x

有人可以帮助我吗?

谢了。

标签: haskell

解决方案


您实际上并不需要索引,您需要的是一个在(*2)和之间交替的列表(-3)。我们可以利用cycle :: [a] -> [a]and zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]。因此我们可以使用:

zipWith ($) (cycle [(2*), subtract 3]) [4,5,6,7,8]

这里($) :: (a -> b) -> a -> b用于执行功能应用程序。所以($) f x等价于f x

这给出了预期:

Prelude> zipWith ($) (cycle [(2*), subtract 3]) [4,5,6,7,8]
[8,2,12,4,16]

推荐阅读