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

如何实现Haskell的interval2函数,按指定步长生成数字序列且禁用区间语法

现有代码的核心问题
  • 步长计算逻辑错误:不管什么场景,下一个生成的数值都应该是x + y,你现有代码中根据x和z的大小关系随意切换加y还是减y,完全违背了步长的定义,导致生成的序列步长和输入参数不符。
  • 终止条件判断错误:现有代码的终止条件逻辑混乱,既没有结合步长的正负判断是否还能继续生成符合要求的数值,还会在终止时错误返回[z],导致结果末尾多出来不需要的元素,或者方向相反时仍然返回错误内容。
  • 未正确匹配Haskell原生区间的终止规则:原生区间当步长方向和起点到终点的方向相反时,会直接返回空列表,你的现有逻辑没有处理这种场景,反而会生成无限序列或者错误序列。
正确实现代码
interval2 :: Int -> Int -> Int -> [Int]
interval2 x y z
  -- 步长为正,当前值已经大于终点,停止生成
  | y > 0 && x > z = []
  -- 步长为负,当前值已经小于终点,停止生成
  | y < 0 && x < z = []
  -- 步长为0的特殊处理,和原生行为一致:如果起点等于终点则无限重复,否则空
  | y == 0 = if x == z then repeat x else []
  -- 加入当前值,递归生成下一个
  | otherwise = x : interval2 (x + y) y z
逻辑验证

所有示例都可以正确匹配:

  • interval2 10 (-1) 0:步长为负,x=10 >= 0,加入10后递归调用interval2 9 (-1) 0,直到x=-1 < 0时返回空,最终结果为[10,9,8..0],符合要求。
  • interval2 10 1 0:步长为正,x=10>0,直接返回空,和原生区间[10,11..0]结果一致。
  • interval2 0 (-2) (-10):步长为负,从0开始每次加-2,直到x=-12 < -10时停止,结果为[0,-2,-4,-6,-8,-10],符合要求。
  • interval2 1 (-1) 10:步长为负,x=1 <10,直接返回空,符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:39:02