【发布时间】:2023-03-15 14:10:02
【问题描述】:
我是 Scala 语言的新手。
我需要 Long 类型的 Range。
我需要一个包含第 1 步的 [1, 2, 3 ... 10000000] 列表。如果我使用 until/to 我会因为使用 Long 而不是 Int 而出错。
我尝试编写一个简单的函数,它需要一个开始、一个结束和一个空列表,并生成一个 [start .. end] 列表。
这是我的功能:
def range_l(start : Long, end : Long, list : List[Long]) : List[Long] = {
if (start == end){
val add_to_list = start :: list
return add_to_list
}
else {
val add_to_list = start :: list
range_l(start + 1, end, add_to_list)
}
}
如果我这样称呼它:range_l(1L, 1000000L, List()) 我会在以下行中得到OutOfMemory 错误:add_to_list = start :: list
你有什么建议吗?如何获得Range[Long] 或如何优化功能。如何避免 OutOfMemory?
谢谢。
【问题讨论】:
-
范围通常不需要具体化。在 REPL 上尝试
1.to(Int.MaxValue)并查看生成的类型。对于这种类型,请随意look at the Scala source :) -
你在谈论
Range,但是你的函数返回List它是scala中的不同类型。如果要List[Long],可以List.range(0L, 10) -
为什么需要这样的范围?很容易得到一个(见范式的答案),但使用它通常是不切实际的。您的问题可能有更好的解决方案。另外,你的错误是什么?
1 to 10000000不会报错。
标签: list scala append range out-of-memory