SML是否有类似Python中range()函数的模块?

4

我正在寻找一个SML函数,它接受一个非负整数并返回一个列表,其中包含从0开始但不包括给定值的所有整数,类似于Python中的range()函数。是的,我可以(并且已经)编写自己的函数,但我更喜欢内置的函数,这样我就不需要在每个项目中都复制和粘贴它。有什么建议吗?提前感谢!

% Python code
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(* SML code: my implementation; I'd prefer a built-in version *)
fun range x = 
    let fun helper current stop = 
        if current = stop 
        then nil 
        else current :: (helper (current + 1) stop)
    in helper 0 x
    end;

(* my code when run *)
- range 10;
val it = [0,1,2,3,4,5,6,7,8,9] : int list
2个回答

15

这可能不太易读,但是...

- List.tabulate(10, fn x => x)
val it = [0,1,2,3,4,5,6,7,8,9] : int list

哦,List.tabulate 就是我想要的。谢谢! - Alan

1

怎么样:

fun ranger 0 = [ 0 ]
  | ranger x = x :: range x-1 

fun range x = reverse (ranger x)

1
这不是良好的类型。如果您通过将0替换为[0]和::替换为@来修复它,则其时间复杂度为O(n ^ 2),而OP的解决方案则为O(n)。 - sepp2k
它也还没有被构建到标准库中。 :-P - Alan
@sepp2k:你说得对(我没有考虑到单向链表)。我已经将其更改为O(2n)版本(假设语法正确-我实际上不知道,也没有ML)。 - Marcin
编写此函数的最佳递归方式是让辅助函数将部分结果作为参数,这样函数将是尾递归的,结果不必被反转。此外,我想指出O(2n)与O(n)是相同的。 - sepp2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接