#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