erlang range

!= erlang



Cocinas en Erlang (4)

Desde los otros idiomas en los que programo, estoy acostumbrado a tener rangos. En Python, si quiero todos los números uno hasta 100, escribo el range(1, 101) . De manera similar, en Haskell escribiría [1..100] y en Scala escribiría de 1 to 100 .

No puedo encontrar algo similar en Erlang, ni en la sintaxis ni en la biblioteca. Sé que esto sería bastante simple de implementar, pero quería asegurarme de que no existiera primero en otro lugar (particularmente porque una implementación estándar de biblioteca o lenguaje sería mucho más eficiente).

¿Hay alguna manera de hacer rangos en el lenguaje Erlang o en la biblioteca estándar? ¿O hay algún idioma que me falta? Solo quiero saber si debo implementarlo yo mismo.

También estoy abierto a la posibilidad de no querer usar un rango en Erlang (no me gustaría estar codificando Python o Haskell en Erlang). Además, si necesito implementarlo yo mismo, si tiene alguna buena sugerencia para mejorar el rendimiento, me encantaría escucharlos :)


Desde http://www.erlang.org/doc/man/lists.html se ve como lists:seq(1, 100) hace lo que usted quiere. También puedes hacer cosas como lists:seq(1, 100, 2) para obtener todos los números impares en ese rango.


Ejemplo de corriente perezosa en Erlang. Aunque no es específico de Erlang, supongo que se puede hacer en cualquier idioma con lambdas. La nueva lambda se crea cada vez que la secuencia avanza, por lo que podría poner algo de tensión en el recolector de basura.

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


Hay una diferencia entre rango en Ruby y lista: seq en Erlang. El rango de Ruby no crea una lista y se basa en el siguiente método, por lo que (1..HugeInteger) .each {...} no consumirá memoria. Listas de Erlang: seq creará una lista (o creo que lo hará). Entonces, cuando el rango se usa para los efectos secundarios, hace una diferencia.

PS No solo por los efectos secundarios:

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

Funcionará de la misma manera que cada uno, no creando una lista. Erlang forma para esto es crear una función recursiva. De hecho, es un bucle oculto de todos modos.


Puede usar la list:seq(From, TO) que dice @bitilly, y también puede usar la lista de comprensión para agregar más funciones, por ejemplo:

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