在Haskell中,我如何实现函数dup,该函数复制列表中偶数位置(0,2,4 ...)上的所有元素

dup :: [a] -> [a]
dup [] = []
dup (x:xs) =  x : x : dup xs
//but only on even index ??


通话示例:

dup [1,5,2,8,4] = [1,1,5,2,2,8,4,4]

最佳答案

好了,我们可以定义两个执行相互递归的函数:dupeven :: [a] -> [a]dupodd :: [a] -> [a]。因此,dupeven将复制第一个元素,然后递归地传递到dupodd。另一方面,dupodd仅复制一个磁头,然后对dupeven执行递归。喜欢:

dupeven :: [a] -> [a]
dupeven [] = []
dupeven (x:xs) = x : x : dupodd xs

dupodd :: [a] -> [a]
dupodd [] = []
dupodd (x:xs) = x : dupeven xs


令人高兴的是,我们得到了两个重复的变体。此外,这两个函数都非常简单:它们仅以两种不同的模式运行:空列表[]和“ cons” (:)

因此,这可以按预期方式工作,此外,我们基本上以较低的实现成本拥有了一个额外的功能:

Prelude> dupeven [1,5,2,8,4]
[1,1,5,2,2,8,4,4]
Prelude> dupodd [1,5,2,8,4]
[1,5,5,2,8,8,4]

09-08 04:25