2011-10-04 8 views
5

Sto dando una piccola presentazione ad un gruppo di programmatori C/C++ che hanno poca esperienza con i linguaggi funzionali. Parte della presentazione menziona Erlang e vorrei dare un esempio di codice piccolo specifico.Erlang Code Snippet che mostra i suoi benefici?

C'è una tonnellata di fantastiche informazioni su StackOverflow su come/dove Erlang viene utilizzato e sui suoi vantaggi. Uno dei vantaggi più comuni che vedo è come si possa fare molto con un solo piccolo codice, soprattutto rispetto a C/C++.

Sto cercando un buon frammento di codice di Erlang che illustra semplicemente questi tipi di vantaggi. Soprattutto qualcosa che viene facilmente fatto in Erlang con poche righe, sarebbe molto più complicato in C/C++.

Qualcuno ha suggerimenti interessanti?

+0

controllare il mio nuovo risposta su terne pitagoriche –

risposta

4

Verificare example 4 per un eccellente esempio di sintassi dei bit di Erlang. Sono sicuro che ci sono un certo numero di sviluppatori c/C++ che apprezzeranno la brevità della sintassi!

+0

I come questo, anche se in realtà non mostra i punti di forza di Erlang quanto mostra i punti di forza della Programmazione Funzionale. –

3

Vorrei utilizzare un esempio che mostra quanto sia facile fare concorrenza.

Quindi, in pratica, scrivere map-reduce (ma mai usare mai quella parola per descriverlo a un programmatore C).

Si potrebbe iniziare visualizzando un programma che riproduce Fizz Buzz e quindi procedere per renderlo simultaneo. Dovrebbe facilmente adattarsi a una lavagna o due pagine di PowerPoint.

+0

Idea interessante per me, per coincidenza, Fizz Buzz è un esempio comunemente usato con questo gruppo! –

3

Un collega ha suggerito di utilizzare Merge-Sort come esempio:

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

versione multi-processo:

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

il frammento di codice fattoriale è il migliore che abbia sempre usato per mostrare quanto possono essere brevi i programmi di erlang

 
-module(factorial). 
-export([calculate/1]). 

calculate(0) -> 1; 
calculate(N) -> N * calculate(N -1). 

Semplice. Questo breve programma illustra non solo quanto possono essere brevi i programmi di Erlang, ma anche: Pattern Matching, Function Clauses e Last Call Optimization.

Ho sempre avuto una versione C++ dello stesso, al di sotto:

 

#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; } 
} 

Beh, questo potrebbe non essere la versione più corta C++, ma so che si ottiene l'idea.

+1

È possibile utilizzare la ricorsione in C/C++. Una funzione equivalente in C/C++ potrebbe essere: 'int factorial (int N) { if (N == 0) return 1; else return N * factorial (N-1); } –

+0

perfetto! Il mio C++ è il peggiore. Grazie @MustafaOzturk –

+1

Ma il codice fattoriale di Erlang sopra non è l'ultima chiamata ottimizzata. L'ultima chiamata è la moltiplicazione per N, che è in attesa su un numero arbitrario di ritorni di stack prima che la prima chiamata per calcolare/1 possa essere completata. Un calcolo/2 è necessario per iterare con un accumulatore affinché LCO funzioni. – zxq9

2

Tripli pitagorici. Ottieni tutte le combinazioni di numeri inferiori a 30 per cui i 3 numeri formano un triangolo ad angolo retto come lo è secondo Pitagora.

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

Provate a farlo in C/C++, o Java e vedere se si eviterà un for loop se non più di uno a seconda del vostro livello di abilità :)

Problemi correlati