偶数索引上列表的重复元素

Cez*_*buz 2 haskell functional-programming

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

dup :: [a] -> [a]
dup [] = []
dup (x:xs) =  x : x : dup xs
//but only on even index ??
Run Code Online (Sandbox Code Playgroud)

调用示例:

dup [1,5,2,8,4] = [1,1,5,2,2,8,4,4]
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

那么我们可以定义两个执行相互递归的函数: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
Run Code Online (Sandbox Code Playgroud)

好消息是我们得到了两个重复的变体。此外,这两个函数都相当简单:它们只对空列表[]和“缺点”这两种不同的模式进行操作(:)

因此,这可以按预期工作,而且我们基本上以(相当)低的实现成本获得了一个额外的功能:

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]
Run Code Online (Sandbox Code Playgroud)