Erlang 二郎山脉

Erlang 二郎山脉,erlang,range,Erlang,Range,从我使用的其他语言开始,我习惯于使用范围。在Python中,如果我希望所有数字1都达到100,我会编写range(1101)。类似地,我在Haskell中编写[1..100],在Scala中编写1到100 我在Erlang中找不到类似的东西,无论是在语法还是在库中。我知道这将是相当简单的实现自己,但我想确保它不存在其他地方首先(特别是因为标准库或语言实现将更有效) 有没有办法在Erlang语言或标准库中创建范围?或者是我遗漏了什么成语?我只是想知道我是否应该自己实施它 我也有可能不想在Erlan

从我使用的其他语言开始,我习惯于使用范围。在Python中,如果我希望所有数字1都达到100,我会编写
range(1101)
。类似地,我在Haskell中编写
[1..100]
,在Scala中编写
1到100

我在Erlang中找不到类似的东西,无论是在语法还是在库中。我知道这将是相当简单的实现自己,但我想确保它不存在其他地方首先(特别是因为标准库或语言实现将更有效)

有没有办法在Erlang语言或标准库中创建范围?或者是我遗漏了什么成语?我只是想知道我是否应该自己实施它

我也有可能不想在Erlang中使用范围(我不想在Erlang中编写Python或Haskell代码)。另外,如果我真的需要自己实现这一点,如果您对提高性能有任何好的建议,我很乐意听到:)

从它看起来像
列表:seq(1100)
做您想要的。您还可以执行类似于
list:seq(1100,2)
的操作来获取该范围内的所有奇数。

您可以使用
list:seq(From,to)
即@bitelly,还可以使用列表理解来添加更多功能,例如:

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|...]

Ruby中的range和Erlang中的list:seq有区别。Ruby的range不创建list,依赖下一个方法,所以(1..HugeInteger)。每个{…}都不会占用内存。Erlang list:seq会创建list(或者我相信会)。所以当range用于副作用时,它确实会产生不同

注意:不仅仅是副作用:

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

将以与每个相同的方式工作,而不是创建列表。Erlang的方法是创建一个递归函数。事实上,它无论如何都是一个隐藏的循环。

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)).

很难说你是否做了错事。你只说了你是如何试图做某事的,而不是你想做什么。@Dustin我想我的意思是我想知道我是否没有像在Erlang那样思考。正如btilly所指出的,List:seq/2是一种方式!我通常可以推荐查看List模块,它确实是v非常有力。哦,看看,如果你不告诉我们你在想什么,我就说不出你在想什么。有功能可以做你想做的事情,但这并不意味着这是做你想做的事情的正确方式。可能是。但没有足够的信息来做出判断。是的,呃lang没有懒散计算的方法。@Rafe当然有!只要使用funs即可。@Daniel诅咒我对语言的早期判断。我应该进一步阅读教程。@DanielYankowsky,您如何在Erlang中使用funs实现懒散流?假设我们需要迭代[1..100]范围内的所有奇数lazy.@Sharas快速的答案是使用一个生成器函数,该函数在流中给定一个值后,可以生成下一个值。因此,“lazy list”将是{initial value,generator function}的元组。如果这不够强大,您可以让生成器函数生成流的整个尾部…这(作为一个流本身)将是一个{initial value,generator function}的元组。当然,没有内置的列表函数可以在这样的流上工作,所以您需要实现您所需要的。有关更多信息,请向so发布一个新问题…有人会回答。