【问题标题】:Does SML have an analog to Python's range()?SML 是否与 Python 的 range() 类似?
【发布时间】:2013-05-04 07:58:46
【问题描述】:

我正在寻找一个 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

【问题讨论】:

    标签: python range sml


    【解决方案1】:

    这可能不那么可读,但是...

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

    【讨论】:

    • 哦,List.tabulate 正是我想要的。谢谢!
    【解决方案2】:

    怎么样:

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

    【讨论】:

    • 那不是很好的类型。如果您通过将 0 替换为 [0] 并将 :: 替换为 @ 来修复它,则为 O(n^2),而 OP 的解决方案为 O(n)。
    • 它还没有内置到标准库中。 :-P
    • @sepp2k:你说得对(我没有考虑单链表)。我已将其更改为 O(2n) 版本(假设语法正确 - 我实际上并不知道或拥有 ML)。
    • 递归编写此函数的最佳方法是让辅助函数将部分结果作为参数。这样,函数将是尾递归的,结果不必反转。我的书呆子还想指出 O(2n) 与 O(n) 是一回事。
    猜你喜欢
    • 2012-03-22
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多