带有步进参数的 sml 中的范围函数

问题描述

我对 SML 和函数式编程非常陌生。

我已经搜索了该网站,但无法找到我的问题的答案。

我正在尝试编写一个带有开始、停止和步长参数的基本范围函数

例如,range(2,12,3) 应该返回列表 [2,5,8,11]。

我没有收到任何错误,但是当我尝试运行 range(2,3);光标前进到下一行,什么也没发生,我什至无法在 smlnj 应用程序中输入任何内容

这是我的代码

fun range(start,stop,step) =
if start = stop then nil
else start::range(start+step,step);

输出

val range = fn : int * int * int -> int list

我需要对代码进行哪些更改,以便在运行 range(2,3) 时得到 [2,11] ?

谢谢

解决方法

您中断递归的条件 (start = stop) 是错误的。在您的示例中,您将使用 start=2start=5start=8start=11start=14、...执行递归调用,从而导致无限循环。不是什么都没发生,只是smnlj一直在计算...

,

只要 stop - start 不是步长的倍数(或零),您就有无限递归。

查看 range(11,12,3),它应该会生成您的最后一个数字:

if 11 = 12 then nil
else 11::range(11+3,3)

这将计算range(14,3)

if 14 = 12 then nil
else 14::range(14+3,3)

然后是 range(17,3),以此类推,无止境。

您需要将 = 替换为 >>=,具体取决于是否应包含 stop