2011-10-04 13 views
5

Daje małą prezentację grupie programistów C/C++, którzy mają bardzo małe doświadczenie z językami funkcjonalnymi. Część prezentacji wspomina o Erlangu i chciałbym podać konkretny przykład małego kodu.Fragment kodu Erlang, który pokazuje swoje zalety?

Jest mnóstwo informacji na temat StackOverflow o tym, jak/gdzie Erlang jest używany i jakie są jego zalety. Jedną z najczęstszych zalet, jaką widzę, jest to, jak wiele można zrobić przy użyciu niewielkiego kodu, szczególnie w porównaniu z C/C++.

Szukam dobrego fragmentu kodu Erlanga, który po prostu ilustruje tego rodzaju korzyści. Zwłaszcza coś, co można łatwo zrobić w Erlang z kilkoma liniami, co byłoby znacznie bardziej skomplikowane w C/C++.

Ktoś ma jakieś interesujące sugestie?

+0

Sprawdź moją nową odpowiedź na Pitagorasa trójek –

Odpowiedz

4

Zapoznaj się z example 4 doskonałym przykładem składni bitowej Erlanga. Jestem pewien, że istnieje wielu programistów c/C++, którzy docenią zwięzłość składni!

+0

I tak jak ten, choć tak naprawdę nie pokazuje zalet Erlanga tak bardzo, jak pokazuje mocne strony programowania funkcjonalnego. –

3

Chciałbym użyć przykładu, który pokazuje, jak łatwo jest współbieżność.

W zasadzie napisz map-zmniejsz (ale nigdy nie używaj tego słowa do opisania go programistowi C).

Możesz zacząć od pokazania programu, który odtwarza Fizz Buzz, a następnie przystąpić do współbieżności. Powinien łatwo zmieścić się w tablicy lub dwóch stronach powerpoint.

+0

Interesujący pomysł dla mnie jako przypadkowego Fizz Buzz jest powszechnie używanym przykładem w tej grupie! –

3

współpracownik zasugerował użycie seryjnej sortowania jako przykład:

http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Erlang

mergeSort(L) when length(L) == 1 -> L; 
mergeSort(L) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    lists:merge(mergeSort(L1), mergeSort(L2)). 

wersja Wielu proces:

pMergeSort(L) when length(L) == 1 -> L; 
pMergeSort(L) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    spawn(mergesort, pMergeSort2, [L1, self()]), 
    spawn(mergesort, pMergeSort2, [L2, self()]), 
    mergeResults([]). 

pMergeSort2(L, Parent) when length(L) == 1 -> Parent ! L; 
pMergeSort2(L, Parent) when length(L) > 1 -> 
    {L1, L2} = lists:split(length(L) div 2, L), 
    spawn(mergesort, pMergeSort2, [L1, self()]), 
    spawn(mergesort, pMergeSort2, [L2, self()]), 
    Parent ! mergeResults([]). 
2

silnia fragment kodu jest najlepszy mam zawsze używane do pokazania, jak krótkie programy erlang mogą być

To proste. Ten krótki program pokazuje nie tylko, jak krótkie mogą być programy Erlang, ale także: Pattern Matching, Function Clauses i Last Call Optimization.

zawsze miałem C++ wersja tego samego, poniżej:

 

#include<iostream.h> 
#include<conio.h> 

long factorial(unsigned int a); 

void main() { 
    unsigned int a; 
    long fac; 
    ..... 
    ..... 
    return factorial(a); 
} 

long factorial(unsigned int x) { 
     long fac=1; 
     if(x == 0) {return 1;} 
     else { 
       while(x > 0) { 
        fac *= x; 
        x -= 1 ; 
       } 
     return fac; } 
} 

No, może nie być to najkrótsza wersja C++, ale wiem, że masz pomysł.

+1

Możesz użyć rekursji w C/C++. Równoważną funkcją w C/C++ będzie: 'int silnia (int N) { jeśli (N == 0) zwróci 1; else return N * silnia (N-1); } ' –

+0

idealne! Moje C++ jest najgorsze. Dzięki @MustafaOzturk –

+1

Ale powyższy kod czynnikowy Erlanga nie jest optymalizowany w ostatnim połączeniu. Ostatnie wywołanie jest mnożeniem przez N, które czeka na dowolną liczbę zwrotów stosu, zanim będzie można zakończyć pierwsze wywołanie do obliczenia/1. Obliczenie/2 jest potrzebne do iteracji z akumulatorem, aby LCO działało. – zxq9

2

Trójkąty Pitagorasa. Uzyskaj wszystkie kombinacje liczb poniżej 30, przy czym 3 cyfry tworzą trójkąt prostokątny, zgodnie z Pythagorasem.

[{X,Y,Z} || X <- lists:seq(1,30), 
      Y <- lists:seq(1,30), 
      Z <- lists:seq(1,30), ((X * X) + (Y * Y)) == (Z * Z)]. 

Spróbuj zrobić to w języku C/C++ lub Java i zobaczyć, czy można uniknąć for loop jeśli nie więcej niż jeden w zależności od poziomu umiejętności :)

Powiązane problemy