1 Востаннє редагувалося 221VOLT (07.04.2016 20:42:16)

Тема: Erlang запитання - відповіді -- приклади

Подумав що буде корисно створити та наповнювати таку тему

формат - запитання-завдання --- під спойлером - розвязок-пояснення
все обговорення - у окремій темі http://replace.org.ua/post/79627/ , щоб не зафлуджувати цю

дякую за увагу =)

2 Востаннє редагувалося 221VOLT (07.04.2016 20:44:36)

Re: Erlang запитання - відповіді -- приклади

отже - поїхали :)


факторіал -
написати функцію обчислення факторіала на Erlang - двома шляхами-алгоритмами,
пояснити який алгоритм працює краще\швидше і чому

Прихований текст

спочатку код функцій :

%factorial - func1
ex1(0) -> 1;
ex1(N) ->
    N * ex1(N-1).

%factorial - func2
ex1f(N) -> ex1f(N,1).
ex1f(0,A) -> A;
ex1f(N,A) when N > 0 -> ex1f(N-1, N*A).

пояснення :

функція ex1f працює краще-швидше, тому що -
у цій функції обчисленнями зайнятий лише один процес, у памяті тримаються лише 2 числа, і кількість операцій за кожен крок обчислення не залежить від кількості кроків обчислення - кількість операцій залишається сталою,,

це є хвостова рекурсія з акумулятором --

у першому рядку - якщо лише один вхідний параметр - отже викликаємо функцію з двома вхідними параметрами - цим же параметром і другим параметром - 1,, оскільки будь-яке число якщо його помножити на 1 -- не зміниться

у другому рядку - за умови що перший вхідний параметр дорівнює нулю (у нас тут він грає роль лічильника кроків) - повертаємо значення другого параметра (це власне і буде результат підрахунку - акумулятор у якому ми власне і зберігаємо результат розрахунків кожного кроку)

у третьому рядку - за умови що перший вхідний параметр більше нуля - викликаємо функцію з новими параметрами для нового кроку


загальний алгоритм фієї функції має складність n (n, 2n, 3n - лінійний)


функція ex1 працює гірше-повільніше, меньш оптимізовано, тому що -

у цій функції кількість процесів які зайняті підрахунками - залежить від величини вхідного параметру --
чим більше число- тим більше процесів буде запущено,

а також - чим більше число - тим більше чисел буде "забито" у память,
тому що перший виклик функції не завершиться поки не буде обчислено загальний результат -
тому кількість чисел у памяті буде збільшуватися поки не закінчиться память або не закінчаться розрахунки


загальний алгоритм цієї функції має складність n! (n! - факторіал - росте швидше ніж експонента)


трошки детальніше про складність алгоритму - у прикладі-задачі 2


зверніть увагу :
у функціях відсутній "захист від дурака", тобто --
відсутня перевірка на відємне число,
відсутня перевірка чи вхідний параметр - взагалі є числом

Подякували: Анатолій, leofun012

3 Востаннє редагувалося 221VOLT (02.05.2016 20:32:16)

Re: Erlang запитання - відповіді -- приклади

числа Фібоначчі -
написати функцію обчислення N-ного числа Фібоначчі на Erlang - двома шляхами-алгоритмами,
пояснити який алгоритм працює краще\швидше і чому

Прихований текст

спочатку код функцій :

%fibonachii - func1
ex2(0) -> 0;
ex2(1) -> 1;
ex2(N) ->
    ex2(N-1) + ex2(N-2).

%fibonachii - func2
ex2f(N) when N > 0 -> ex2f(N, 0, 1).
ex2f(0, F1, _F2) -> F1;
ex2f(N, F1, F2) -> ex2f(N-1, F2, F1+F2).

пояснення :

функція ex2 працює повільніше ніж ex2f, тому що -
як і у випадку з факторіалом - перший варіант - тримає всі числа-проміжні результами одночасно у памяті
+ кількість рекурсивних викликів функції - активних процесів - зростає надто стрімко,,
у другому варіанті - у памяті тримаються лише три числа та займається обчисленнями лише один процес


у цій задачі ми також маємо справу з алгоритмами різної складності - (n!)^(n-2) (якщо не помиляюсь) та n (2*n) відповідно


складність алгоритму - загалом означає\визначає на скільки збільшиться кількість часу обчислення загального результату (додаткових операцій [маленьких додаткових кроків] та проміжних даних) при збільшенні ключевих операцій алгоритму [великих кроків] (пояснення своїми словами, кому тре академічне визначення з вікі - велкам у гугл і вікі),,

у програмуванні кращим вважається алгоритм, складність якого є лінійна, гіршим - експонента чи факторіал -- таку складність алгоритму рекомендують уникати

більш детально про складність алгоритмів ви може нагуглити за фразою "Big-O"



порівняти швидкість алгоритмів обох функцій ви можете самостійно - приблизно з числа 30-40 (в залежності від заліза) - різниця стає відчутно помітна неозброєним оком :)


зверніть увагу :
у функціях відсутній "захист від дурака", тобто --
відсутня перевірка на відємне число,
відсутня перевірка чи вхідний параметр - взагалі є числом



upd. стосовно формули, приведеної leofun01 - http://replace.org.ua/post/79637/#p79637

Прихований текст
leofun01 написав:

Ну якщо вже порівнювати ефективність алгоритмів для чисел Фібоначчі, то варто розглянути і інші, більш ефективні алгоритми, зокрема формулу, яка має виконуватися приблизно за час O(1).
http://mathworld.wolfram.com/images/equations/FibonacciNumber/NumberedEquation6.gif
Мені цікаво як в Erlang буде виглядати код для такої формули.

формула буде виглядати так -

ex2g(N) -> (math:pow((1 + math:sqrt(5)),N) - math:pow((1 - math:sqrt(5)),N)) / (math:pow(2,N) * math:sqrt(5)).

і повертає вона float (у той час як вщенаведені приклади повертають int)


при спробах привести цей float до int - я зіткнувся з помилками та похибками при великих значеннях

способів привести float to int в ерлангу я поки що знаю тільки 2 --
заокруглення та переведення у строку(список) (строку далі можна у число привести)

ex2g(N) -> trunc((math:pow((1 + math:sqrt(5)),N) - math:pow((1 - math:sqrt(5)),N)) / (math:pow(2,N) * math:sqrt(5))).

та відповідно

ex2g(N) -> float_to_list((math:pow((1 + math:sqrt(5)),N) - math:pow((1 - math:sqrt(5)),N)) / (math:pow(2,N) * math:sqrt(5)) ,[{decimals,0}]).

помилки -- наприклад при N більше 600 (у останньому варіанті)-- випадала наступна помилка --

** exception error: an error occurred when evaluating an arithmetic expression
     in function  math:pow/2
        called as math:pow(3.23606797749979,700)
     in call from ex:ex2g/1 (ex.erl, line 19)

як з цим розібратися - я поки не знаю, буде час - напевно досліджуватиму


також присутні похибки обчислення у цьому варіанті з float

21> ex:ex2f(100).               
354224848179261915075
22> ex:ex2g(100).               
"354224848179263110000"

24> ex:ex2g(100).
354224848179263111168
25> ex:ex2f(100).
354224848179261915075

стосовно складності алгоритмів і швидкодії ---
різниці по часу між цією формулою та варіантом 2 -- до 600 включно - не було виявлено неозброєним оком
(після 600- цей варіант через проблеми з float потестувати не получись)
варіант 2 було потестовано і вище ніж 600 --
у випадках

2> ex:ex2f(10).
55
3> ex:ex2f(100).
354224848179261915075
4> ex:ex2f(1000).
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
5> ex:ex2f(3000).
410615886307971260333568378719267105220125108637369252408885430926905584274113403731330491660850044560830036835706942274588569362145476502674373045446852160486606292497360503469773453733196887405847255290082049086907512622059054542195889758031109222670849274793859539133318371244795543147611073276240066737934085191731810993201706776838934766764778739502174470268627820918553842225858306408301661862900358266857238210235802504351951472997919676524004784236376453347268364152648346245840573214241419937917242918602639810097866942392015404620153818671425739835074851396421139982713640679581178458198658692285968043243656709796000
7> ex:ex2f(10000).
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875

різницю по часу обчислення чисел Фібоначчі N=10, N=100,N=3000,N=10000 неозброєним мікроскопом оком не було виявлено - все ті ж якісь частки секунди :)


Подякували: leofun01, 0xDADA11C7, Betterthanyou3

4 Востаннє редагувалося 221VOLT (08.05.2016 17:44:44)

Re: Erlang запитання - відповіді -- приклади

Робота зі строками (списками), бінарними строками:
обєднання строк, розділення

Прихований текст

Прості строки у ерлангу представлені списками,
у яких кожен символ - це число-код,
тому з ними може бути незручно і незвично працювати:

1> [1,2,3].
[1,2,3]
2> [83,117,114,112,114,105,115,101].
"Surprise"

натомість у ерлангу класно працювати з бінарними строками


обєднання

обєднаємо декілька бінарних строк (для кирилиці явно укажемо utf8 щоб все було класно)

3> B1 = <<"1,2">>.
<<"1,2">>
4> B2 = <<"3,4">>.
<<"3,4">>
5> B3 = <<" зайчик"/utf8>>.
<<32,208,183,208,176,208,185,209,135,208,184,208,186>>
6> B4 = <<B1/binary, B2/binary, B3/binary>>.
<<49,44,50,51,44,52,32,208,183,208,176,208,185,209,135,208,184,208,186>>

обєднаємо строки "спискові" (тут, нажаль, кирилицю ніяк не впихнути (або я поки не знаю як) )

7> B5 = iolist_to_binary(["1,2","3,4","zaika"]).
<<"1,23,4zaika">>

також можна написати власну функцію для обєднання двох списків :

lj(A,[]) -> A.
lj(A,B) ->
    [C1|C2] = B,
    lj([A|C1],C2).

тут ми беремо і "переливаємо" список B у список A, і коли список B стає "пустим" - повертаємо список A


також для обєднання списків ще можна використати (проте не рекомендується - відносно повільно)

8> C1 = [1,2,3].
[1,2,3]
9> C2 = [4,5,7].
[4,5,7]
10> C3 = C1 ++ C2.
[1,2,3,4,5,7]

натомість рекомендується додавати у [Head|Tail],
що ми і зробили у функції вище

проте, ми розпочали про строки --

11> A1 = "abc".
"abc"
12> A2 = "efa".
"efa"
13> string:join([A1,A2],"-").
"abc-efa"

розділення
У випадку з бінарним списком - ми можемо його перебрати і вибрати потрібні нам значення -
наприклад парні

11> C1 = [1,2,3,4,5,7].
[1,2,3,4,5,7]
12> [C || C <- C1, C rem 2 =:= 0].
[2,4] 

або ті, які більше 3

11> C1 = [1,2,3,4,5,7].
[1,2,3,4,5,7]
12> [C || C <- C1, C > 3].
[4,5,7]

проте, ми розпочали про строки --

13> re:split("red - blue", "-", [{return, list}]).
["red "," blue"]

14> re:split("Hello.world.howdy?", "[.]", [{return, list}]).
["Hello","world","howdy?"]

а також

15> string:sub_string("Hello World", 4, 8).
"lo Wo"

і на завершення - про бінарні строки :

22> Bin = <<"Hello.world.howdy?">>.
<<"Hello.world.howdy?">>
23> binary:split(Bin, <<".">>, [global]).
[<<"Hello">>,<<"world">>,<<"howdy?">>]

,

16> A1 = <<"abcde">>.
<<"abcde">>
17> <<A2:4/binary,A3/binary>> = A1.
<<"abcde">>
18> A2.
<<"abcd">>
19> A3.
<<"e">>

а також

20> S1 = <<"some_____text">>.
<<"some_____text">>
21> S2 = binary:part(S1,{0,4}).
<<"some">>

------
довжина бінарних строк --

A = erlang:byte_size(Binary),
A2 = erlang:size(Binary),

------
крім того для можливості гарячого оновлення коду - потрібно використовувати глобальні виклики власних функцій замість локальних,
тобто ми можемо так переписати власну функцію для обєднання двох списків :

lj(A,[]) -> A.
lj(A,B) ->
    [C1|C2] = B,
    ?MODULE:lj([A|C1],C2).
Подякували: 0xDADA11C7, leofun01, Betterthanyou3

5

Re: Erlang запитання - відповіді -- приклади

Робота зі строками (списками), бінарними строками:
to lowercase, to uppercase

Прихований текст

строки-списки --

1> string:to_lower("Five Boxing WIZARDS").
"five boxing wizards"
2> string:to_upper("jump QuickLY").
"JUMP QUICKLY"

(здається з кирилицею не фур-фур)

бінарні строки -

варіант 1 -
"перегнати" у списки, і далі-перший варіант

binary_to_list(X)

варіант 2 -
знайшов у чувака на гітхабі модуль, форкнув - будемо розбиратися
https://github.com/221V/unistring/blob/ … string.erl

Подякували: 0xDADA11C7, leofun012

6

Re: Erlang запитання - відповіді -- приклади

Перетворення по типах у ерлангу

Прихований текст
% <<"Вася">> => "Вася"
binary_to_list(X)

% "Вася" => <<"Вася">> ; [7,7,7] => <<7,7,7>>
list_to_binary(X)

% <<"127">> => 127
list_to_integer(binary_to_list(X))

% 127 => <<"127">>
list_to_binary(integer_to_list(X))

% erlang => <<"erlang">>
atom_to_binary(erlang, utf8)
Подякували: 0xDADA11C7, leofun012

7 Востаннє редагувалося 221VOLT (24.05.2016 00:21:05)

Re: Erlang запитання - відповіді -- приклади

вивід даних різних типів у консоль

Прихований текст
% строковий параметр-ключ(чи як його краще обізвати?) ~s - виводить у строковому представленні
% ~n -- це перевід строки
io:format("~s~n", [[83, 97, 109, 112, 108, 101]]).
Sample

% ~p -- у бінарному представленні
io:format("~p~n", [<<"binary білочка"/utf8>>]).
<<98,105,110,97,114,121,32,208,177,209,150,208,187,208,190,209,135,208,186,208,176>>

% ~w -- виводить без перетворення, тобто "як є", цим способом можна вивести не лише строку чи число, але й інші типи-структури ерланга у консоль
io:format("~w~n", ["Sample"]).
[83,97,109,112,108,101]

% ще є такий 
io:format("Number ~w is character ~c~n", [101, 101]).
Number 101 is character e

ще трошки роботи зі списками

Прихований текст
1> A = [1,2,5,7].
[1,2,5,7]
2> erlang:length(A).                       
4
3> lists:nth(3, A).
5
4> lists:member(8,A).
false
5> lists:member(2,A).
true
6> lists:delete(2,A).
[1,5,7]
7> A.
[1,2,5,7]

upd:
знайшов для себе нову фішечку-
оскільки строки у ерлангу- списки ---
можна перебрати строку як список і викинути-вирізати звідти всі символи які нам не потрібні --

Body1 = [X || X <- Body0, X =/= $\", X=/=${, X=/=$}, X=/=$\\, X=/=$[, X=/=$]],
Подякували: 0xDADA11C7, leofun01, Betterthanyou3

8 Востаннє редагувалося 221VOLT (03.07.2016 00:57:49)

Re: Erlang запитання - відповіді -- приклади

трошки роботи з регулярками у ерлангу

Прихований текст
2> re:run("String", "^[0-9]*$").
nomatch
3> re:run("64", "^[0-9]*$").    
{match,[{0,2}]}
4> re:run("64п76", "^[0-9]*$").
** exception error: bad argument
     in function  re:run/2
        called as re:run([54,52,1087,55,54],"^[0-9]*$")
5> re:run(<<"64п76">>, "^[0-9]*$").
nomatch
6> re:run(<<"6476">>, "^[0-9]*$"). 
{match,[{0,4}]}
7> re:run(<<"6476z">>, "^[0-9]*$").
nomatch
8> re:run(<<"6476z">>, "^[0-9].$").
nomatch

2> re:run(<<"380937777777">>, "^[0-9]{12}$").
{match,[{0,12}]}
3> re:run(<<"testt7777@gmail.com">>, "^[a-z0-9_-]+(\.[a-z0-9_-]+)*@([0-9a-z][0-9a-z-]*[0-9a-z]\.)+([a-z]{2,8})$").
{match,[{0,19},{-1,0},{10,6},{16,3}]}

upd.

Прихований текст

у функції це буде так --

is_valid_logpass(A,B) ->
    if B =/= <<>> ->
        case re:run(A, "^[0-9]{12}$") of
            nomatch ->
                case re:run(A, "^[a-z0-9_-]+(\.[a-z0-9_-]+)*@([0-9a-z][0-9a-z-]*[0-9a-z]\.)+([a-z]{2,8})$") of
                    nomatch ->
                        {false,<<"login">>};
                    _ ->
                        {true,<<"email">>}
                end;
            _ ->
                {true,<<"mphone">>}
        end;
        B =:= <<>> -> {false,<<"pass">>}
    end.

раніше я писав так -

is_valid_logpass(A,B) ->
    if B =/= <<>> ->
        C = re:run(A, "^[0-9]{12}$"),
        if C =/= nomatch ->
            {true,<<"mphone">>};
        C =:= nomatch ->
            D = re:run(A, "^[a-z0-9_-]+(\.[a-z0-9_-]+)*@([0-9a-z][0-9a-z-]*[0-9a-z]\.)+([a-z]{2,8})$"),
            if D =/= nomatch ->
                {true,<<"email">>};
            D =:= nomatch ->
                {false,<<"login">>}
            end
        end;
        B =:= <<>> -> {false,<<"pass">>}
    end.

проте мені пояснили що тримати зайву змінну у памяті і так писати функціональний ерланг - по- нубськи :)

Подякували: 0xDADA11C7, leofun012

9 Востаннє редагувалося 221VOLT (24.05.2016 00:19:02)

Re: Erlang запитання - відповіді -- приклади

Цей приклад у ерлангу (тобто, http запит)

Прихований текст

тут я використав elli,
код нижче - для веб-сторінки цього веб-серверу -тобто коллбек
(тут я використав костиль замість повноцінної json-парсинг бібліотеки - краще так не робити:) )

handle('GET',[<<"vk">>], _Req) ->
ssl:start(),
inets:start(),
Method = post,
URL = "https://api.сайт-злодій/method/users.get?user_ids=1&fields=photo_big&name_case=Nom&version=5.30",
Header = [],
Type = "application/x-www-form-urlencoded",
Body = "",
HTTPOptions = [],
Options = [],
R = httpc:request(Method, {URL, Header, Type, Body}, HTTPOptions, Options),
{ok, {Code, Head, Body0}} = R,
Body1 = [X || X <- Body0, X =/= $\", X=/=${, X=/=$}, X=/=$\\, X=/=$[, X=/=$]],
{_,Uid,_,FName,_,LName,_,P1,P2} = list_to_tuple(string:tokens(string:sub_string(Body1, 10), ",:")),
ZZ = Uid ++ ": " ++ FName ++ " " ++ LName ++ "<br><img src=\"" ++ P1 ++ ":" ++ P2 ++ "\"><br>",
R3 = erlang:list_to_binary(ZZ),
R4 = <<"суп"/utf8>>,
{ok, [{<<"Content-Type">>, <<"text/html; charset=utf-8">>}], <<"", R3/binary, R4/binary>>};

результат у браузері

а також - отримання списку країн з вк апі

Прихований текст

тут я також використав elli

handle('GET',[<<"vk">>], _Req) ->
inets:start(),
Method = post,
URL = "http://api.сайт-злодій/method/database.getCountries?need_all=1&count=1000&v=5.52&lang=ua",
Header = [],
%Type = "application/json",
Type = "application/x-www-form-urlencoded",
Body = "",
HTTPOptions = [],
Options = [],
R = httpc:request(Method, {URL, Header, Type, Body}, HTTPOptions, Options),
{ok, {Code, Head, Body0}} = R,
R3 = erlang:list_to_binary(Body0),
{ok, [{<<"Content-Type">>, <<"text/html; charset=utf-8">>}], <<"", R3/binary>>};

результат у браузері

далі буде...

Подякували: leofun011

10 Востаннє редагувалося 221VOLT (20.01.2017 03:26:26)

Re: Erlang запитання - відповіді -- приклади

робота з ets (код elixir, в erlang -- так же, лише додаткові крапки-коми-крапка_з_комою в кінці строк)

Прихований текст
def test_ets() do
    table = :ets.new(:file0, [:set, :public])
    IO.inspect :ets.insert_new(table, {"1", "test77"})
    IO.inspect :ets.insert_new(table, {"2", "778"})
    IO.inspect :ets.insert_new(table, {"3", "тест 99"})
    IO.inspect :ets.match(table, {:"$1", :"$2"})
    #[["3", "тест 99"], ["1", "test77"], ["2", "778"]]
    IO.inspect :ets.delete(table, "2")
    IO.inspect :ets.match(table, {:"$1", :"$2"})
    #[["3", "тест 99"], ["1", "test77"]]
    IO.inspect :ets.delete(table)
    :ok
  end
  
  def test_ets2() do
    table = :ets.new(:file2, [:set, :public])
    IO.inspect :ets.insert_new(table, {"1", "test77"})
    IO.inspect :ets.insert_new(table, {"2", "778"})
    IO.inspect :ets.insert_new(table, {"3", "тест 99"})
    IO.inspect :ets.match(table, {"1", :"$2"})
    #[["test77"]]
    IO.inspect :ets.match(table, {"7", :"$2"})
    #[]
    IO.inspect :ets.delete(table, "2")
    IO.inspect :ets.match(table, {:"$1", :"$2"})
    #[["3", "тест 99"], ["1", "test77"]]
    IO.inspect :ets.delete(table)
    :ok
  end

11 Востаннє редагувалося 221VOLT (08.03.2018 17:15:17)

Re: Erlang запитання - відповіді -- приклади

інфо -
всі приклади з доповненнями, оновленнями,
цікавими фічами та корисними приколами -
переїхали в блог, url нижче

[:}  *DANCE*

Подякували: 0xDADA11C7, Betterthanyou, Monolith3

12 Востаннє редагувалося Monolith (10.09.2017 13:14:15)

Re: Erlang запитання - відповіді -- приклади

* блог у найближчому майбутньому буде дороблюватися (дизайн, деякі функції)...

Подякували: 221VOLT1

13

Re: Erlang запитання - відповіді -- приклади

порахувати скільки разів зустрічається буква на сторінці видачі гугла
( для прикладу, перша сторінка запиту "erlang", рахуємо регістронезалежно букву g, тобто g та G )

Прихований текст

нарахували
Count: 2492
( включно з тегами, теги не парсили  :D  )

код - task.erl

Прихований текст
-module(task).
-compile([export_all, nowarn_export_all]).


do() ->
  ssl:start(),
  %inets:start(),
  application:start(inets),
  ?MODULE:do2().

do2() ->
  Address = "https://www.google.com.ua/search?q=erlang&ie=utf-8&oe=utf-8&client=firefox-b-ab&gfe_rd=cr&dcr=0&ei=d9wiWo7aMYOK6AT-k4HACw",
  ?MODULE:get_data(Address).

get_data(Address) ->
  case httpc:request(get, {Address, 
    []}, [{ssl,[{verify,0}]}], []) of
    {ok,{_Status, _Headers , Content}} ->
      
      %io:format("~p~n",[Content]),
      %io:format("~ts~n",[Content]),
      
      ?MODULE:count_sym(Content,0);
      
    _ ->
      ?MODULE:get_data(Address)
  end,
  ssl:stop(),
  inets:stop().


count_sym([],Acc) ->
  io:format("Count: ~p~n",[Acc]);
count_sym([H|Tail],Acc) ->
  case H of
    71 ->
      % G
      ?MODULE:count_sym(Tail,Acc + 1);
    103 ->
      % g
      ?MODULE:count_sym(Tail,Acc + 1);
    _ -> ?MODULE:count_sym(Tail,Acc)
  end.
Подякували: NaharD, Monolith2

14 Востаннє редагувалося 221VOLT (18.08.2019 08:46:29)

Re: Erlang запитання - відповіді -- приклади

221VOLT написав:

факторіал - ...

upd.
у новій версії erlang (22) ситуація помінялась --
числодробилка стала швидша,
поведінка прикладів трішки змінилась...

проведу додаткові тести, виложу на гітхаб та додам посилання тут

upd. 2
https://github.com/221V/fact_fib_test
цікаво получилось —
erlang to_llvm у випадку не-хвостової рекурсії у мене приблизно в 4.1 раз швидше для підрахунку Фібоначчі,
ніж просто ерланг, а от з факторіалом якось без відмінностей
числодробилка php 7 швидше, числодробилка хаскеля ще швидше

на прикладі розрахунку факторіалу виглядає, наче варіант з хвостовою рекурсією повільніший,
та розрахунок чисел Фібоначчі все ж показує, що хвостова рекурсія -- штука швидка та потрібна

загалом числодробилка хаскеля швидша за числодробилку ерланга приблизно в 1.3 -- 11.4 раз