2011-02-02 8 views
19

내가 프로그래밍하는 다른 언어에서 범위가있는 데 익숙해졌습니다. 파이썬에서 모든 숫자를 100으로 만들려면 range(1, 101)을 써야합니다. 마찬가지로, 하스켈에서 나는 [1..100]을 쓸 것이고, 스칼라에서는 1 to 100이라고 쓸 것입니다.얼랑 (Erlang)의 범위

구문이나 라이브러리에서 Erlang과 비슷한 것을 찾을 수 없습니다. 나는 이것이 자신을 구현하는 것이 매우 간단하다는 것을 알고 있지만, 다른 곳에서는 존재하지 않는다는 것을 확신하고 싶다. (특히 표준 라이브러리 나 언어 구현이보다 효율적으로로드되기 때문에).

Erlang 언어 또는 표준 라이브러리에서 범위를 수행 할 수있는 방법이 있습니까? 아니면 제가 누락 된 관용구가 있습니까? 나는 그것을 직접 구현해야하는지 알고 싶다.

얼랭 (Erlang)에서 범위를 사용하고 싶지 않을 수도 있습니다. (얼랭 (Erlang)에서는 파이썬이나 하스켈을 코딩하고 싶지 않습니다.) 또한 성능 향상을위한 좋은 제안이 있다면 직접 구현해야 할 필요가 있습니다. 그 (것)들을 듣고 싶습니다. :)

+0

잘못된 것을하고 있는지 여부는 말하기 어렵습니다. 당신은 당신이하려고하는 것이 아니라, 당신이 어떻게하려고하는지에 대해서만 말했습니다. – Dustin

+0

@Dustin 내가 의미하는 바는 Erlang에서해야 할 것처럼 생각하지 않는다는 것을 알고 싶다는 것입니다. –

+0

btilly가 지적한대로, 목록 : seq/2가 길입니다! 나는 일반적으로 목록 모듈을 보는 것을 권장 할 수있다. 정말 강력하다. 아, 그리고 http://www.erldocs.com을 보시오. –

답변

45

http://www.erlang.org/doc/man/lists.htmllists:seq(1, 100)은 원하는대로 수행됩니다. lists:seq(1, 100, 2)과 같은 작업을 수행하여 해당 범위의 모든 홀수를 대신 얻을 수도 있습니다.

+0

목록 : seq/2가 가장 좋은 방법입니다. – BlackMamba

8

예를 들어, 더 많은 기능을 추가하는 당신의이 @bitilly 말 list:seq(From, TO)을 사용할 수 있으며, 또한 당신은 지능형리스트를 사용할 수 있습니다 얼랑의 서열 : 루비의 범위와 목록 사이에 차이가 있습니다

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

. Ruby의 범위는 목록을 생성하지 않고 다음 방법에 의존하므로 (1..HugeInteger). 각 {...}는 메모리를 먹지 않습니다. 얼랭 목록 : seq 목록을 만들 것입니다 (또는 나는 그것을 믿을 것입니다). 따라서 범위가 부작용으로 사용되면 차이가 발생합니다.

P. 부작용뿐만 아니라 :

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

은 각각 동일한 방식으로 작동하며 목록을 만들지 않습니다. Erlang 방법은 재귀 함수를 만드는 것입니다. 사실, 그것은 어쨌든 숨겨진 루프입니다.

+0

예, 얼랭은 게으른 평가를위한 수단이 없습니다. –

+1

@ 안전합니다. 그냥 재미를 사용하십시오. –

+0

@ 대니얼은 언어에 대한 저의 초기 판단을 저주합니다. 나는이 튜토리얼을 더 읽어야한다. –

1

얼랭의 지연 스트림 예. 얼랭 특유의 것은 아니지만, 람다가있는 어떤 언어에서도 가능할 것입니다. 스트림이 고급화 될 때마다 새 람다가 만들어져 가비지 컬렉터에 부담을 줄 수 있습니다.

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