telecomunicaciones - ¿Fragmento de código de Erlang que muestra sus beneficios?
erlang tutorial (5)
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 vea si evitará un for loop
si no más de uno, según su nivel de habilidad :)
Daré una pequeña presentación a un grupo de programadores C / C ++ que tienen muy poca experiencia con lenguajes funcionales. Parte de la presentación menciona a Erlang, y me gustaría dar un pequeño ejemplo específico de código.
Hay una tonelada de información impresionante 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?
Un compañero de trabajo sugirió usar Merge-Sort como 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 multiproceso:
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([]).
Usaría un ejemplo que muestra qué fácil es hacer concurrencia.
Así que básicamente escribe map-reduce (pero nunca uses esa palabra para describirlo a un programador C).
Puede comenzar mostrando un programa que reproduzca Fizz Buzz , y luego proceda a hacerlo concurrente. Debe caber fácilmente una pizarra blanca, o dos páginas de PowerPoint.
Vea el ejemplo 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!
el fragmento de código factorial es el mejor que siempre he usado para mostrar cómo pueden ser cortos los programas de erlang
-module(factorial). -export([calculate/1]). calculate(0) -> 1; calculate(N) -> N * calculate(N -1).
Tan sencillo como eso. Ese programa corto ilustra no solo qué tan cortos pueden ser los programas de Erlang, sino también: Pattern Matching
, Function Clauses
y Last Call Optimization
.
Siempre tuve una versión 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, esta puede no ser la versión más corta de C ++, pero sé que entiendes la idea.