如何实现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
相关产品推荐
相关产品推荐

