在其他编程语言中,我习惯于使用范围。在Python中,如果我想要1到100的所有数字,我会写range(1, 101)
。类似地,在Haskell中,我会写[1..100]
,在Scala中,我会写1 to 100
。
我在Erlang中找不到类似的东西,无论是语法还是库。我知道这对我来说实现起来相当简单,但我想首先确保它在其他地方不存在(特别是因为标准库或语言实现会更有效地加载)。
在Erlang语言或标准库中是否有一种方法可以处理范围?或者是否有一些我遗漏的习惯用法?我只是想知道我是否应该自己实现它。
我也不想在Erlang中使用range(我不想用Erlang编写Python或Haskell)。而且,如果我确实需要自己实现它,如果你有什么好的改进性能的建议,我很乐意听听:)
4条答案
按热度按时间kcrjzv8t1#
从http://www.erlang.org/doc/man/lists.html看,
lists:seq(1, 100)
就像你想做的那样。你也可以做lists:seq(1, 100, 2)
这样的事情来得到这个范围内的所有奇数。u5rb5r592#
你可以使用
list:seq(From, TO)
,也就是@bitilly,你也可以使用列表解析来添加更多的功能,例如: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:
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.
9gm1akwq4#
Erlang中的懒惰流的例子。虽然它不是Erlang特有的,但我想它可以在任何有lambda的语言中完成。每次流被推进时都会创建新的lambda,所以它可能会给垃圾收集器带来一些压力。