haskell - 偶数索引上列表的重复元素
问题描述
在 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]
推荐阅读
- vba - 代表 Outlook 邮件中的电子邮件 ID 而不是发件人 ID 捕获实际
- php - 无法使用 PHP Sendmail 发送电子邮件。您的服务器可能未配置为使用此方法发送邮件
- docker - 无法将第二个组织对等连接到 HLF 中的通道
- javascript - message.data 是否仅在代码尝试获取时才传输?
- r - 在数据框中创建计数器,该计数器根据值或新 ID 的变化进行重置
- reactjs - 如何在视图中呈现具有不同 URL 的灯箱?
- php - 通过 shell_exec() 从 git pull 查看更多信息
- android - 无法运行 react-native 项目 android 版本
- javascript - 获取静态视频/mp4 文件的 blob URL,video.load() 抛出 ERR_REQUEST_RANGE_NOT_SATISFIABLE
- python - 忽略某些键的两个字典列表之间的区别