[Erlang]Покритикуйте код с точки зрения фп

 
0
 
Functional languages
ava
chaos | 26.10.2010, 11:05
Доброго времени суток!
Увлекся тут ФП. Читаю Филд А., Харрисон П. - Функциональное программирование
Для кодинга больше нравится Erlang в ввиду его применимости в жизни. ИМХО. smile
Выполняю значит упражения:
1. Конвертирую число на отрезке от 0 до + бесконечности в 2ичную систем
2. Сложить два 2ичных числа

вот что я набыдлокодил smile

-module(tut).
-export([dec2bin/1, bin2dec/1]).

dec2bin(X) ->
    dec2bin(X, []).

dec2bin(0, []) ->
    [0];

dec2bin(0, List) ->
    List;

dec2bin(X, List) ->
    dec2bin(trunc(X / 2), [X rem 2 | List]).

bin2dec(List) ->
    bin2dec(List, 0).

bin2dec([], Res) ->
    Res;

bin2dec([Head | Rest], Res) ->
    bin2dec(Rest, Res + Head * pow(2, llen(Rest))).
    
%*****************
llen([]) ->
    0;

llen([_ | Rest]) ->
    llen(Rest, 1).

llen([], Len)->
    Len;

llen([_ | Rest], Len) ->
    llen(Rest, Len + 1).

pow(_, 0) -> 1;

pow(X, N) when N > 0 ->
    X * pow(X, N - 1).



42> tut:dec2bin(375).
[1,0,1,1,1,0,1,1,1]
43> tut:dec2bin(tut:bin2dec([1,1,1,1]) + tut:bin2dec([1,1,1,1,1,1,1,1])).
[1,0,0,0,0,1,1,1,0]


Хочу услышать Вашей критики.
Comments (9)
ava
Ryukzak | 26.10.2010, 10:17 #
А почему для бинарных данных использован список?

А реализация мне нравится. Но как мне кажется, элегантнее было бы использовать вместо рекурсии свёртку. По крайней мере, я бы сделал так.
ava
chaos | 26.10.2010, 10:24 #
Цитата (Ryukzak @  26.10.2010,  07:17 findReferencedText)
А почему для бинарных данных использован список?

наверно потому что с Erlang'ом знаком крайне крайне мало. Пока больше внимания уделяю теории ФП

Цитата (Ryukzak @  26.10.2010,  07:17 findReferencedText)
Но как мне кажется, элегантнее было бы использовать вместо рекурсии свёртку.

я пока не знаю что такое свертка smile
ava
Ryukzak | 26.10.2010, 14:22 #
Вот тут можно об этом почитать для erlang http://en.citizendium.org/wiki/Erlang_(pro...torials/Folding

Чудесный рассказ о свёртках был в одном из номеров практики ФП. Называлась она "Пределы применимости свёрток". Очень рекомендую, но правда она больше теоретическая и на haskell.
ava
Void | 26.10.2010, 15:53 #
dec2bin хорошо, bin2dec получилась с квадратичной сложностью на ровном месте. Переписывается в три строчки, с линейной сложностью и хвостовой рекурсией без использования функций вычисления длины списка и возведения в степень, подумай как :-)

С помощью свёртки bin2dec получается ещё короче (см. ф-ю lists:foldl), а вот рекурсивный вариант dec2bin скорее всего даже на Хаскеле будет удобнее и нагляднее.

Чисто по Эрлангу: trunc(X / Y) здесь можно заменить на X div Y. Функция length есть встроенная, думаю больше одного раза писать её вручную неинтересно.
ava
chaos | 26.10.2010, 19:59 #
Void, ну вот так только переписал smile

-module(tut).
-export([b2d/1]).

b2d(List) ->
        b2d(lists:reverse(List), 1, 0).

b2d([], _, Res) ->
        Res;

b2d([Head | Rest], N, Res) ->
        b2d(Rest, 2 * N, Res + N * Head).


Вы про другой вариант говорили? Если да то не говорите решение smile
ava
Void | 26.10.2010, 20:12 #
Тепло, но можно обойтись двумя параметрами и без обращения списка.
ava
chaos | 26.10.2010, 20:29 #
Цитата (Void @  26.10.2010,  17:12 findReferencedText)
Тепло, но можно обойтись двумя параметрами и без обращения списка. 


и даже не нужно знать длину списка? В Вашем алгоритме нужны какие-нибудь спец функции ?
ava
Void | 26.10.2010, 20:48 #
Ничего не надо. Хинт: если взять двоичное число N и приписать к нему справа цифру X, чему будет равно получившееся число?
ava
chaos | 26.10.2010, 21:41 #
Void, победил

-module(tut).
-export([b2d/1]).

b2d([Head | Rest]) ->
        b2d(Rest, Head).

b2d([], Res) ->
        Res;

b2d([Head | Rest], Res) ->
        b2d(Rest, 2 * Res + Head).


пришлось взять листок с ручкой и включить моск

upd:
Познокомился тут со сверткой....и переписал данную функцию иначе

b2d([Head | Rest]) -> lists:foldl(fun(X, Res) -> 2 * Res + X end, Head, Rest).


"крутатень" (с)
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  chaos   Void   Ryukzak
advanced
Submit