Фрагмент кода Erlang, который демонстрирует свои преимущества?

#erlang

#erlang

Вопрос:

Я провожу небольшую презентацию для группы программистов на C / C , у которых очень мало опыта работы с функциональными языками. В части презентации упоминается Erlang, и я хотел бы привести конкретный небольшой пример кода.

В StackOverflow есть масса потрясающей информации о том, как / где используется Erlang и его преимуществах. Одно из наиболее распространенных преимуществ, которые я вижу, — это то, что он может многое сделать с помощью небольшого краткого кода, особенно по сравнению с C / C .

Я ищу хороший фрагмент кода Erlang, который просто иллюстрирует эти типы преимуществ. Особенно то, что легко сделать в Erlang с несколькими строками, что было бы намного сложнее в C / C .

У кого-нибудь есть интересные предложения?

Комментарии:

1. Ознакомьтесь с моим новым ответом на пифагорейские тройки

Ответ №1:

Посмотрите пример 4 для получения отличного примера битового синтаксиса Erlang. Я уверен, что есть несколько разработчиков c / c , которые оценят краткость синтаксиса!

Комментарии:

1. Мне нравится этот вариант, хотя на самом деле он не столько демонстрирует сильные стороны Erlang, сколько демонстрирует сильные стороны функционального программирования.

Ответ №2:

Я бы использовал пример, который показывает, насколько легко выполнять параллелизм.

Итак, в основном пишите map-reduce (но никогда не используйте это слово, чтобы описать его программисту на C).

Вы могли бы начать с показа программы, которая воспроизводит Fizz Buzz, а затем продолжить, чтобы сделать ее параллельной. Должен легко поместиться на доске или на двух страницах PowerPoint.

Комментарии:

1. Интересная идея для меня, поскольку, по совпадению, Fizz Buzz является часто используемым примером в этой группе!

Ответ №3:

Коллега предложил использовать Merge-Sort в качестве примера:

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

Многопроцессорная версия:

 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([]).
  

Ответ №4:

Пифагорейские тройки. Получите все комбинации чисел ниже 30, в результате чего 3 числа образуют прямоугольный треугольник, как это согласно Пифагору.

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

Попробуйте сделать это на C / C или Java и посмотрите, сможете ли вы избежать for loop , если не более одного, в зависимости от вашего уровня квалификации 🙂

Ответ №5:

фрагмент кода factorial — лучшее, что я всегда использовал, чтобы показать, насколько короткими могут быть программы erlang

-модуль (факториал).
-экспорт ([calculate/1]).

вычислить (0) -> 1;
вычислить (N) -> N * вычислить (N -1).

Вот так просто. Эта короткая программа иллюстрирует не только то, насколько короткими могут быть программы Erlang, но также: Pattern Matching , Function Clauses и Last Call Optimization .

У меня всегда была версия того же C , приведенная ниже:

#включить<iostream.h>
#включить<conio.h>

длинный факториал (unsigned int a);

void main() {
unsigned int a;
длинный fac;
 .....
 .....
 возвращает факториал (a); 
}

длинный факториал (unsigned int x) {
long fac=1;
 if(x == 0) {возвращает 1;}
 else {
while(x > 0) {
fac *= x;
x -= 1 ;
 }
вернуть fac; } 
}

Ну, возможно, это не самая короткая версия C , но я знаю, что вы поняли идею.

Комментарии:

1. Вы можете использовать рекурсию в C / C . Эквивалентной функцией в C / C было бы: int factorial(int N) { if (N == 0) return 1; else return N * factorial(N-1); }

2. идеально ! Мой C — худший. Спасибо @MustafaOzturk

3. Но приведенный выше факториальный код Erlang не оптимизируется для последнего вызова. Последний вызов — это умножение на N, которое ожидает произвольного числа возвратов стека до завершения первого вызова для вычисления /1 . Для итерации с аккумулятором для работы LCO требуется вычисление /2.

4. Ознакомьтесь с моим новым ответом на Pythagorean Triples