如何用Haskell生成1,2,1,3,2,1…结构的无限Integer序列
Haskell实现指定无限序列的方案
首先定义题目要求的Sequence类型别名:
type Sequence = [Integer]
核心实现完全贴合你提到的思路,代码非常简洁:
targetSeq :: Sequence targetSeq = concat [ [n, n-1 .. 1] | n <- [1..] ]
逻辑说明
- 用
[1..]生成无限正整数序列,依托Haskell的惰性求值特性,仅会在需要时计算对应元素,不会有内存溢出问题 - 对每个正整数
n,用[n, n-1 .. 1]生成从n倒序到1的有限子序列 - 用
concat拼接所有子序列,最终得到目标无限序列
等价写法
你也可以根据偏好选择更偏向函数式风格的实现,效果完全一致:
-- concatMap实现版本 targetSeq = concatMap (\n -> [n, n-1 .. 1]) [1..] -- 列表Monad运算符实现版本 targetSeq = [1..] >>= \n -> [n, n-1 .. 1]
验证方法
可以通过take函数截取前N个元素验证结果是否符合预期:
-- 取前15个元素,输出为 [1,2,1,3,2,1,4,3,2,1,5,4,3,2,1],和样例完全匹配 take 15 targetSeq
内容的提问来源于stack exchange,提问作者proceeder
相关产品推荐
相关产品推荐

