如何在Erlang中生成整数范围?

vq8itlhq  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(144)

在其他编程语言中,我习惯于使用范围。在Python中,如果我想要1到100的所有数字,我会写range(1, 101)。类似地,在Haskell中,我会写[1..100],在Scala中,我会写1 to 100
我在Erlang中找不到类似的东西,无论是语法还是库。我知道这对我来说实现起来相当简单,但我想首先确保它在其他地方不存在(特别是因为标准库或语言实现会更有效地加载)。
在Erlang语言或标准库中是否有一种方法可以处理范围?或者是否有一些我遗漏的习惯用法?我只是想知道我是否应该自己实现它。
我也不想在Erlang中使用range(我不想用Erlang编写Python或Haskell)。而且,如果我确实需要自己实现它,如果你有什么好的改进性能的建议,我很乐意听听:)

kcrjzv8t

kcrjzv8t1#

http://www.erlang.org/doc/man/lists.html看,lists:seq(1, 100)就像你想做的那样。你也可以做lists:seq(1, 100, 2)这样的事情来得到这个范围内的所有奇数。

u5rb5r59

u5rb5r592#

你可以使用list:seq(From, TO),也就是@bitilly,你也可以使用列表解析来添加更多的功能,例如:

1> [X || X <- lists:seq(1,100), X rem 2 == 0].
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,
 44,46,48,50,52,54,56,58|...]
frebpwbc

frebpwbc3#

There is a difference between range in Ruby and list:seq in Erlang. Ruby's range doesn't create list and rely on next method, so (1..HugeInteger).each { ... } will not eat up memory. Erlang lists:seq will create list (or I believe it will). So when range is used for side effects, it does make a difference.
P.S. Not just for side effects:

(1..HugeInteger).inject(0) { |s, v| s + v % 1000000 == 0 ? 1 : 0 }

will work the same way as each, not creating a list. Erlang way for this is to create a recursive function. In fact, it is a concealed loop anyway.

9gm1akwq

9gm1akwq4#

Erlang中的懒惰流的例子。虽然它不是Erlang特有的,但我想它可以在任何有lambda的语言中完成。每次流被推进时都会创建新的lambda,所以它可能会给垃圾收集器带来一些压力。

range(From, To, _) when From > To ->
    done;
range(From, To, Step) ->
    {From, fun() -> range(From + Step, To, Step) end}.

list(done) ->
    [];
list({Value, Iterator}) ->
    [Value | list(Iterator())].

% ----- usage example ------

list_odd_numbers(From, To) ->
    list(range(From bor 1, To, 2)).

相关问题