2011-10-04 17 views
5

Ofrezco una pequeña presentación a un grupo de programadores C/C++ que tienen muy poca experiencia con los lenguajes funcionales. Parte de la presentación menciona a Erlang, y me gustaría dar un pequeño ejemplo específico de código.¿Fragmento de código de Erlang que muestra sus beneficios?

Hay una tonelada de información asombrosa sobre StackOverflow sobre cómo/dónde se usa Erlang y sus ventajas. Una de las ventajas más comunes que veo es cómo puede hacer mucho con solo un pequeño código, especialmente en comparación con C/C++.

Estoy buscando un buen fragmento de código de Erlang que simplemente ilustre estos tipos de beneficios. Especialmente algo que es fácil de hacer en Erlang con pocas líneas, eso sería mucho más complicado en C/C++.

¿Alguien tiene alguna sugerencia interesante?

+0

Compruebe hacia fuera mi nueva respuesta en ternas pitagóricas –

Respuesta

4

Consulte example 4 para obtener un excelente ejemplo de la sintaxis de bit de Erlang. ¡Estoy seguro de que hay varios desarrolladores de c/C++ que apreciarán la brevedad de la sintaxis!

+0

I como este, aunque realmente no muestra las fortalezas de Erlang tanto como muestra las fortalezas de la Programación Funcional. –

3

Usaría un ejemplo que muestra qué fácil es hacer concurrencia.

Básicamente, escriba map-reduce (pero nunca use esa palabra para describirlo a un programador C).

Puede comenzar mostrando un programa que reproduce Fizz Buzz, y luego proceder a hacerlo concurrente. Debe caber fácilmente una pizarra blanca, o dos páginas de PowerPoint.

+0

¡Una idea interesante para mí, como casualmente, Fizz Buzz es un ejemplo comúnmente utilizado en este grupo! –

3

un compañero de trabajo sugirió utilizar Combinar-Ordenar ejemplo:

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

versión multi-proceso:

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

el fragmento de código factorial es el mejor que he siempre se usa para mostrar cómo los programas cortos de erlang pueden ser

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

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

Tan simple como eso. Ese programa corto ilustra no solo cuán cortos pueden ser los programas de Erlang, sino también: Pattern Matching, Function Clauses y Last Call Optimization.

siempre tenía una versión de C++ de la misma, a continuación:

 

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

Bueno, esto puede no ser la más corta versión de C++, pero sé que se entiende la idea.

+1

Puede usar recursividad en C/C++. Una función equivalente en C/C++ sería: 'int factorial (int N) { if (N == 0) return 1; else return N * factorial (N-1); } ' –

+0

¡perfecto! Mi C++ es el peor. Gracias @MustafaOzturk –

+1

Pero el código factorial de Erlang anterior no es la última llamada optimizable. La última llamada es la multiplicación por N, que está esperando en un número arbitrario de retornos de pila antes de que se complete la primera llamada para calcular/1. Se necesita un cálculo/2 para iterar con un acumulador para que LCO funcione. – zxq9

2

Pythagorean Triples. Obtenga todas las combinaciones de números por debajo de 30 por lo que los 3 números forman un triángulo en ángulo recto según lo que dice Pitágoras.

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

Intente hacer eso en C/C++ o Java y ver si va a evitar una for loop si no más de una dependiendo de su nivel de habilidad :)

Cuestiones relacionadas