从我编程的其他语言中,我习惯了范围。在Python中,如果我想要所有数字一到100,我写range(1, 101)
。同样地,在Haskell中,我写了[1..100]
,在Scala中,我写了1 to 100
。
我在Erlang中找不到类似的东西,无论是在语法还是库中。我知道自己实现起来相当简单,但我想确保它在其他地方不存在(特别是因为标准库或语言实现会加载更高效)。
有没有办法在Erlang语言或标准库中执行范围?还是有一些我不知道的成语?我只想知道自己是否应该实施它。
我也很开放我不想在Erlang中使用范围(我不想在Erlang中编写Python或Haskell)。另外,如果我确实需要自己实现,如果你有任何提高性能的好建议,我很乐意听到它们:)
答案 0 :(得分:53)
从http://www.erlang.org/doc/man/lists.html看起来lists:seq(1, 100)
可以满足您的需求。您也可以执行lists:seq(1, 100, 2)
之类的操作来获取该范围内的所有奇数。
答案 1 :(得分:11)
你可以使用{@ 1}来表示@bitilly,你也可以使用列表推导来添加更多功能,例如:
list:seq(From, TO)
答案 2 :(得分:2)
Ruby和list中的范围之间存在差异:Erlang中的seq。 Ruby的范围不会创建列表并依赖于下一个方法,因此(1..HugeInteger).each {...}不会占用内存。 Erlang列出:seq将创建列表(或者我相信它会)。因此,当范围用于副作用时,它确实会产生影响。
P.S。不只是副作用:
(1..HugeInteger).inject(0) { |s, v| s + v % 1000000 == 0 ? 1 : 0 }
将以与每个相同的方式工作,而不是创建列表。 Erlang的方法是创建一个递归函数。事实上,它无论如何都是一个隐藏的循环。
答案 3 :(得分:1)
Erlang中的惰性流示例。虽然它不是Erlang特有的,但我想它可以用lambdas的任何语言完成。每次传输流时都会创建新的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)).