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