Erlang Code Snippet, который демонстрирует свои преимущества? - PullRequest
5 голосов
/ 04 октября 2011

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 04 октября 2011

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

3 голосов
/ 05 октября 2011

Сотрудник предложил использовать 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([]).
3 голосов
/ 05 октября 2011

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

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

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

2 голосов
/ 04 сентября 2014

Пифагорейские Тройки. Получите все комбинации чисел меньше 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, если не более одного, в зависимости от вашего уровня квалификации:)

2 голосов
/ 05 октября 2011

Фрагмент кода кода - это лучшее, что я всегда использовал, чтобы показать, насколько короткими могут быть программы на эрланге

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

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

Так просто. Эта короткая программа иллюстрирует не только то, насколько короткими могут быть программы Erlang, но также: <b><a href="http://en.wikipedia.org/wiki/Pattern_matching" rel="nofollow">Pattern Matching</a></b>, Function Clauses и <a href="http://en.wikipedia.org/wiki/Tail_call" rel="nofollow">Last Call Optimization</a>.

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


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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...