You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell如何构建指定长度、由初始值迭代生成元素的列表

迭代列表生成函数实现方案

为什么replicate无法直接实现需求

replicate的函数签名为replicate :: Int -> a -> [a],作用是将第二个输入的固定值重复指定次数生成列表,无法实现「逐次对前一个元素应用函数生成新元素」的逻辑,因此你最初的思路确实不可行,使用iterate是更合理的选择。

基于iterate的最优实现

iterate的函数签名为iterate :: (a -> a) -> a -> [a],会生成一个无限长的迭代序列:从传入的初始值开始,每一位元素都是前一位元素应用指定函数得到的结果,刚好匹配你需要的[x, f x, f(fx), ...]生成规则,只需要截取前len位即可得到目标列表。

实现代码如下:

buildList::Int -> (b -> b) -> b -> [b]
buildList len func initial = take len $ iterate func initial

示例验证

调用buildList 5 (*2) 1,输出结果为[1,2,4,8,16],符合需求。

(不推荐)基于replicate的实现思路

如果一定要用replicate完成需求,可以用索引映射的方式实现,代码如下:

buildList len func initial = map (\i -> foldr (.) id (replicate i func) initial) [0..len-1]

该方案存在大量重复计算,时间复杂度为O(n²),效率远低于基于iterate的实现,仅做思路参考不建议实际使用。

内容的提问来源于stack exchange,提问作者user1612508

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:15:03