anonymous@RULINUX.NET~# Last login: 2024-12-27 12:51:41
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Никто случайно не хочет Эрланг поизучать,

Субж! Я вот тут уже устал от ПыхПыха, Питона, Ц/Ц++ и прочей императивщины, и в связи с этим решил расширить свой кругозор, так сказать)))

Может кого тоже эта тема вставляет?

Обменялись бы мнениями, и так далее. Напишем наконец правильную асинхронную мегакапчу на нашу днявочку и элементами матана и садомазо, Ы?

anonymous(*) (2011-08-03 20:24:00)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

является ли устройство, изображенное на капче, анальной пробочкой? ответ да/нет

))))))))))))))))))))

vilfred(*)(2011-08-03 21:25:40)

Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Посоветуй какой-нибудь приличный учебник по этому вашему эрлангу, но чтобы для полных быдлокодеров. А то erlang course на официальном сайте какой-то немногословный и пугающий.

SystemV(*)(2011-08-03 21:26:32)

Emacs-w3m/1.4.414 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>по изучать
Для начала выучи, что в русском языке предлога перед глаголом быть не может!

anonymous(*)(2011-08-03 21:28:26)

Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Посоветуй какой-нибудь приличный учебник по этому вашему эрлангу, но чтобы для полных быдлокодеров. А то erlang course на официальном сайте какой-то немногословный и пугающий.
"Erlang Programming", Francesco Cesarini & Simon Thompson, O'Reilly

anonymous(*)(2011-08-03 21:55:30)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>"Erlang Programming", Francesco Cesarini & Simon Thompson, O'Reilly
Спасибо, почитаем.

SystemV(*)(2011-08-03 22:28:41)

Emacs-w3m/1.4.414 w3m/0.5.3
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>"Erlang Programming", Francesco Cesarini & Simon Thompson, O'Reilly
Спасибо, почитаем.

Пожалуста. Я сам сейчас по ниму учусь. Позитивно, что в книге заодно и функциональное программирование преподаётся.

anonymous(*)(2011-08-04 00:26:47)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>> по изучать
> Для начала выучи, что в русском языке предлога перед глаголом быть не может!

Ты знаешь, после того как я это запостил, после трудового дня прошедшего в копании ПыхПых Симфонии. Я был конечно же немного неадекватен. Но я увидел эту багу, но Туксоид для ананимусов отрезал функцию редактирования (ему минус за это). И что мне оставалось? Уповать на то что граммар-наци идут на хуй (обойдемся без условностей, на нашем ресурсе пока ещё можно посылать на хуй))).

Так чта извиняй)))

Ax-Xa-Xa(*)(2011-08-04 01:12:13)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

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

Я прекрасно начал с  http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml и дошел до темы межпроцесорного взаимодействия за два дня (~3-4 часа в день). Правда я на прошел не так давно курс sicp, ну не буду понтоваться где-то на 3/5, задрал матан в примерах.

Но впрочм немного сейчас вникну в тему рекордов, в упоминаемой статье они зря не освщались (это наверно все таки в доках эрганга). Потом вернусь к статье по поводу межпроцесорного взаимодействия, попутно читая OTP в  http://erlanger.ru/wiki/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0. и думаю через недельку другую, доберусь до мойшевеба.)))

Ax-Xa-Xa(*)(2011-08-04 01:24:21)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>> "Erlang Programming", Francesco Cesarini & Simon Thompson, O'Reilly
Спасибо, почитаем.

> Пожалуста. Я сам сейчас по ниму учусь. Позитивно, что в книге заодно и функциональное программирование преподаётся.

Функциональное программирование лучше по SICP. Небольшой вынос мозга, но если не всё вынесло - ерланг пойдет гораздо легче.)))

Ax-Xa-Xa(*)(2011-08-04 01:28:11)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Пишу на эрланге распределенный аналог жуйки для анонимусов, сейчас использую связку erlang+exmpp+yaws. Уже есть рабочий прототип. Пиши в жаббер bonegnasher [at] jabber.ru

anonymous(*)(2011-08-04 02:55:18)

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Открою небольшой секрет: ни схема, ни лисп, ни эрланг не являются строго функциональными языками, потому как позволяют использование императивных конструкций и побочных эффектов.

anonymous(*)(2011-08-04 03:10:27)

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Открою небольшой секрет: ни схема, ни лисп, ни эрланг не являются строго функциональными языками, потому как позволяют использование императивных конструкций и побочных эффектов.
Да, и это хорошо, поскольку позволяет мне решать, когда использовать функциональное и когда императивное програмирование. Язык я выберал под конкретную задачу: программирование сетевых програм.

anonymous(*)(2011-08-04 11:48:08)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Функциональное программирование лучше по SICP. Небольшой вынос мозга, но если не всё вынесло - ерланг пойдет гораздо легче.)))
> Правда я на прошел не так давно курс sicp, ну не буду понтоваться где-то на 3/5, задрал матан в примерах.
Матан - это хорошо. Спасибо за информацию. Посмотрю, может можно будет делать упражнения на erlang или поищю аналоги с haskell.

anonymous(*)(2011-08-04 12:01:58)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Без императивщины реальной проги всё равно не сделаешь. А лисп никогда как функциональный и не позиционировался вообще-то.

bugmaker(*)(2011-08-05 07:29:39)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.04 (lucid) Firefox/3.6.17
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Эрланг-трэд стартует здесь. Просьба к модераторам не трогать пока, пусть повисит некоторое время. На фоне обсуждения УГ и политоты хоть какая-то польза. В devel все-равно никого нет.

anonymous(*)(2011-08-06 05:36:14)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Без императивщины реальной проги всё равно не сделаешь.
Не теряя функциональной чистоты можно использовать монады. Их и к эрлангу приделали, например.  http://erlanger.ru/page/1574/monady-i-srezy-v-erlang-e-erlando

anonymous(*)(2011-08-06 05:41:20)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Не теряя функциональной чистоты можно использовать монады
Блять, объясните мне кто-нибудь популярно, что такое монада и с чем её едят. Плиз!

anonymous(*)(2011-08-06 05:56:11)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Эрланг-трэд стартует здесь.
ОМГ! Закрепили. ОК, обещаю запостить сюда статью "Как сделать на Эрлаге асинхронный TCP сервер без костылей и в рамках ОТP". Если конечно всё будет хорошо.)))

Ax-Xa-Xa(*)(2011-08-06 06:09:51)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

С точки зрения программиста монада это абстрактный контейнер с тремя функциями.

map — заменяет содержимое контейнера без изменения самого контейнера. Заменяем каждый гвоздь в коробке шурупом, каждый int в массиве float-ом — так map и работает.

unit — берет элемент и возвращает контейнер с одним этим элементом. Делаем из гвоздя коробку с одним гвоздем. Делаем из int массив из одного int.

join — уменьшает вложенность контейнеров — из коробки коробок гвоздей делает коробку с гвоздями (из массива массивов int-ов — массив int-ов). Ну или из коробки коробок коробок гвоздей делаем коробку коробок гвоздей. Это уже сложная концепция, доступная только программистам и более абстрактно развитым товарищам; обычный человек будет обескуражен тем, как в одну коробку могли поместиться несколько точно таких-же коробок. Впрочем, простая замена коробок коробок на мешки мешков или пакеты пакетов позволяет совершить абстрактно-теоретико-категориальный прорыв.

Необязательные сведения: мы имеем иерархию абстрактных контейнеров, которые эти функции наследуют так:

haskell
 функтор(map) ← pointed functor (map, unit) ← монада (map, unit, join).
 

Еще более необязательная информация: между pointed functor и монадой в этой иерархии аппликативный функтор. Также можно добавить к монаде ноль — пустую коробку и плюс — берем две коробки (эти две коробки сами не в коробке!) и складываем их содержимое в одну такую же коробку. Ноль, естественно, для этого плюса будет нейтральным элементом.

Представьте, что у нас есть функция f, которая что-то делает с двумя значениями, объектами. Эти два объекта мы можем получать разными способами. Допустим, что мы ищем их в некоем хранилище, базе данных, коллекции, т.е. они результат поиска, запроса. Можем найти, а можем и не найти.

csharp
X x = FindX();
Y y = FindY();
if(x.NotNull() && y.NotNull()) // если нужные нам значения получены
    return f(x, y); // вычисляем результат
else
   return null; // результат получить не можем, возвращаем ничего
 

Тут логика перепутана с проверкой возвращаемых значений, да и проверки реализуются для каждого использования поиска, по месту.

Разделяется и повторно используется она монадой Maybe

haskell
do {
    x ← FindX();
    y ← FindY();
    return f (x, y);
}
 
все, теперь проверки где-то за кадром, пишутся они один раз и потом работают.

Допустим, мы хотим получить результаты f для некоего набора значений. Проверить, например, функцию f на ее области определения или для каких-то особых случаев.

csharp
List result = new List();
for(X x in xs) {
    for(Y y in ys) {
        result.Add(f(x, y));
    }
}
 

Проход по наборам иксов и игреков также можно отделить от логики.

haskell
List result = do {
    x ← xs;
    y ← ys;
    return f(x, y);
}
 

Похоже на декартово произведение, записанное в нотации для множеств, что собственно нам и надо. Разумеется, одна реализация интерфейса-монады для списка позволит писать и так

haskell
do {
    a ← alist;
    b ← blist;
    c ← clist;
    return foo(a,b,c);
}
 

т.е. за кулисами нашей монады могут быть циклы любой вложенности, каждый раз реализовывать работу с несколькими списками по месту нам больше не понадобится. Точно также все будет работать и для других монад: Парсим строку, получаем значения x и y, возращем результат применения f. Если x и y не распарсились — возвращаем ошибку парсинга.

haskell
do {
    x ← ParseX();
    y ← ParseY();
    return f (x, y);
}
 

Получаем значения по сети, ждем, пока придут оба, потом возвращаем результат применения f.

haskell
do {
    x ← Get("www.x.org");
    y ← Get("www.y.net");
    return f (x, y);
}
 

И так далее. Более того, для монады можно реализовать функции, "поднимающие" другие функции в монады.

haskell
Parser parser = ParserMonad.Lift(f);
 

Все, теперь мы превратили функцию f в парсер. Даже

haskell
do { ← ← ...return }
 

писать не обязательно. Необязательные свдения — для этих примеров достаточно аппликативного функтора — возможности монад несколько шире.

Все мы изучали в школе свойства сложения, умножения, тригонометрических функций и т.д. Они позволяли упростить некоторое громоздкое выражение и решить задачу. Программирование — это решение задач. Упрощение там может пригодится, а может пригодится усложнение — оптимизация, но упрощение и усложнение, всякое преобразование кода в программировании это путь по минному полю. Мы можем думать, что отрефактореный код делает то же самое, но это не обязательно так. Как не покрывай код тестами, но покрытие это статистическое и баг может проскочить. Ну и проскакивает. В школе было проще, выражения равны, это доказано "багу" взяться неоткуда.

haskell
a*c + b*c == c*(a + b)
 

Это оптимизация. Мы заменили одну простую операцию и две сложных на одну простую и одну сложную. Функторы, монады, моноиды и т.д. приводят школьную простоту и железную надежность доказательства в программирование. Если мы гарантируем выполнение простых свойств, то и сложные преобразования больших объемов кода с соблюдением этих простых правил будут корректны.

haskell
map f . map g == map f . g
 

Это свойство функтора (а следовательно и монады) и тоже оптимизация. Мы заменили работу со списком в два прохода эквивалентной работой в один проход. До этого я писал, в основном, о монадах и функторах, а вопрос был еще и про стрелки. Тут у нас есть стрелки-функции (да, функция это стрелка) и комбинация этих стрелок:

haskell
f . g == x |→ g(f(x)) == fun (x) { return g(f(x)); }
//комбинация функций дает нам новую функцию.
id . f == f
//id - нейтральный элемент для ., как 0 нейтральный элемент для +, а 1 для *:

0 + x == x
1 * x == x
 

Если у нас есть

haskell
0 * ОченьСложноеВычисление
 

то нет смысла делать сложное вычисление — мы уже знаем ответ. Для map тоже есть значение, "отношения" операции map с которым похожи на отношение операции умножения с нулем. это id — функция, которая дает результат равный принимаемому значению.

haskell
map id огромныйСписок == id огромныйСписок == огромныйСписок
 

нет смысла проходить по огромному списку — он не изменится. "Какой-то бред", может подумать читатель "откуда у нас вдруг возьмется функция, которая ничего не делает?". Легко возмется. Есть множество пар действий, которые будучи сгруппированы (мы ведь упрощаем программу-выражение) дадут ничего не делающую функцию. Папример, поворот изображения по часовой стрелке в комбинации с поворотом изображения против часовой стрелки не делает ничего. есть также операции, которые становятся ничего не делающими при повторном применении, в комбинации с самими собой — зеркальное отражение изображения, например. Другие свойства монад:

haskell
map f . unit == unit . f
 

Для того, чтобы собирать из монад конструкции из первой части, нам нужны специальные операции, которые монады соединяют. Самая простая из них — рыбка (>=>). Рыбка, как и . комбинирует стрелки, но не всякие, а стрелки Клейсли, т.е. функции, которые упаковывают значение (предмет) в монаду (коробку). Одну стрелку клейсли мы уже упоминали — это unit. Unit нейтральный элемент для рыбки, как id для . и 0 для +:

haskell
unit >=> f == f
f >=> unit == f
 

Рыбка ассоциативна, как и + и *:

haskell
(a >=> b) >=> c == a >=> (b >=> c)
(x + y) + z == x + (y + z)
 

Самая известная из них — bind (>>=), это когда мы сначала делаем map стрелкой Клейсли, а потом уменьшаем вложенность монад операцией join

haskell
m >>= f = join (map (f, m))

unit(a) >>= f == f(a)
 

кладем a в коробку

haskell
[a]
 

применяем к внутренностям коробки функцию f

haskell
[f(a)]
 

f это стрелка Клейсли, она кладет свой результат в коробку

haskell
[[b]]
 

а теперь джойним коробки

haskell
[b]
 

готово, то же что и просто

haskell
f(a)[b]
 

haskell
m >>= unit == m
 

тут все понятно, упаковываем содержимое коробки в коробку, добавляя вложенность коробок, а потом убираем лишнюю вложенность коробок — бессмысленное занятие.

haskell
m >>= (x |→ k x >>= h) = (m >>= k) >>= h
 

Это уже совсем не так весело, вот потому-то и начинать объяснение монад с bind — это ошибка. Смотрите лучше на join и рыбок.

haskell
map f m = m >>= unit . f
 

выражаем map через bind — упаковывая результат функции f в коробку.

Используя такой вот "алгебраический подход", можно рефакторить программы с обоснованной корректностью преобразования при условии выполнении свойств, а также писать, например, наивную реализацию, которую легко придумать и понять, а потом так же корректно трансформировать в реализацию эффективную, но, возможно, неочевидную и плохо читаемую. Пример таких преобразований на небольшой программе продемонстрирован в этой презентации, но материал не простой, не для первого чтения, потому как слайды в презентации перевернуты, ну а что поделать? В equational reasoning царской дороги нет. Также требуется знание синтаскиса и семантики языка haskell, что, конечно, не так сложно, как переворачивание слайдов, но, тем не менее, не совсем легко.

Резюмируя. Фактически, это аналог того процесса, который произошел гораздо раньше в физике. Два тысячелетия философы спорили о том, летит стрела Зенона или не летит, но вот составили набор простых правил и вуаля: производные находит ученик 10-го класса. Т.е. молодое ремесло "программирование" выпускается из детского сада и идет в школу с перспективой поступить в институт, получить диплом и стать обычной инженерной деятельностью. Вроде самолетостроения. Надеюсь, что на этот раз тысячелетий не понадобится.

anonymous(*)(2011-08-06 08:15:20)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Да и вообще, в интернетах over9000 всяких монадных блогпостов, однако понимать их практически невозможно — не стоит даже и пытаться. Все что можно из них извлечь — это странные продукты подсознания автора монадного тьюториала и его детские страхи.

Вот, например, годная статья про монады, где рассказывается про монады с точки зрения теории категорий.:  http://stefan-klinger.de/files/monadGuide.pdf Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана.

anonymous(*)(2011-08-06 08:35:36)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> С точки зрения программиста монада это абстрактный контейнер с тремя функциями.
...

> Да и вообще, в интернетах over9000 всяких монадных блогпостов, однако понимать их практически невозможно — не стоит даже и пытаться. Все что можно из них извлечь — это странные продукты подсознания автора монадного тьюториала и его детские страхи.
> Вот, например, годная статья про монады, где рассказывается про монады с точки зрения теории категорий.:  http://stefan-klinger.de/files/monadGuide.pdf Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана.
Большое спасибо за информацию.

anonymous(*)(2011-08-06 13:16:30)

Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана.
Не отказался бы прочитать.

Ax-Xa-Xa(*)(2011-08-06 18:25:30)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> и вуаля: производные находит ученик 10-го класса.
Математический и физический смысл производной описывается одним предложением. А запощенная сюда попытка дать определение термину монада на овер 500 строк вряд ли можно назвать популярным объяснением.)))

Ax-Xa-Xa(*)(2011-08-06 18:30:34)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Математический и физический смысл производной описывается одним предложением.
Я тоже могу сказать, что монада это эндофунктор и два естественных преобразования. Или, например, что монада это моноид в категории эндофункторов.

>А запощенная сюда попытка дать определение термину монада на овер 500 строк вряд ли можно назвать популярным объяснением.)))
Приведенное объяснение в самом деле популярное и адекватное, однако требует некоторого знакомства с языком Haskell. Что именно непонятно?

Более сложное определение с кратким введением в теорию категорий приводится в статье Стэфана Клингера, ссылку на которую я дал выше.

anonymous(*)(2011-08-06 19:53:36)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>> Математический и физический смысл производной описывается одним предложением.
> Я тоже могу сказать, что монада это эндофунктор и два естественных преобразования. Или, например, что монада это моноид в категории эндофункторов.
Аха, понятно. А извините, что такое эндофунктатор и естественное преобразование? :)

Я конечно понимаю, что смысл производной практически невозможно объяснить неграмотному пастуху. Но его можно объяснить, человеку получившему начальное среднее образование. Поэтому логично ввести категорию человека, которому надо объяснить, что такое монада.

Пусть это будет программист сносно владеющий Си. Например понятное для него определение функции высшего порядка: "Функция принимающая в качестве параметра и/или возвращающая в результате другую функцию".

Если у тебя получиться объяснить монаду, то можешь считать что ты многое сделал для популизации функцирнальщины.)))

Ax-Xa-Xa(*)(2011-08-06 20:44:11)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Если у тебя получиться объяснить монаду, то можешь считать что ты многое сделал для популизации функцирнальщины.)))
Собственно, что такое монада объясняется в первых четырех параграфах. Все остальное - это примеры и необязательные сведения. Чтобы начать использование монад на практике, приведенного материала вполне достаточно. Также могу посоветовать познакомиться с хаскелем.

anonymous(*)(2011-08-07 09:03:07)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Сегодня на швабрашвабре опубликовали неплохую статью о монадах:  http://habrahabr.ru/blogs/programming/125782/

anonymous(*)(2011-08-07 09:33:40)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Сегодня на швабрашвабре опубликовали неплохую статью о монадах:  http://habrahabr.ru/blogs/programming/125782/

Пока еще не прочитал вдумчиво, но утверждение что тот кто не знает матана не сможет спроектировать усилитель - бля, нам как бэ намекает. Афтор сноб живущий в своем собственном сферическом вакууме, делающий выводы об окружающей его среде только на основе своих мыслеветвлений.) Есть умный термин такого мировоззрения, но сейчас не припомню.

anonymous(*)(2011-08-08 15:21:05)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

"Монады — это живые, духообразные единицы, из которых все состоит и кроме которых ничего в мире нет" (педивикия). Как - то так махарадж тролил бы топик стартера, изведя его на говно. Ибо истину глаголит Лейпниц - отец, порадивший сына монадологию, и куда без духа святого - философии, аминь, блеать.

anonymous(*)(2011-08-08 15:57:18)

Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Пока еще не прочитал вдумчиво, но утверждение что тот кто не знает матана не сможет спроектировать усилитель - бля, нам как бэ намекает. Афтор сноб живущий в своем собственном сферическом вакууме, делающий выводы об окружающей его среде только на основе своих мыслеветвлений.) Есть умный термин такого мировоззрения, но сейчас не припомню.
Рассуждать можно много и долго о ненужности всяких знаний. Гораздо быстрее и проще открыть книжку по дискретной математике и прочитать несколько глав. Не надо даже ходить в магазин, достаточно зайти на gen.lib.rus.ec или lib.homelinux.org. Там есть даже книжка О'Доннелла (два в одном) - основы дискретной математики и хаскелль. И да, там где учат специалистов по электронике и электротехнике матан и дискретку преподают, инфа 100%.

anonymous(*)(2011-08-09 02:58:08)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Это я к тому, что вполне можно спаять усилитель, ничего не зная о работе его компонентов. Вполне можно использовать монады, понятия не имея о том как они работают.

anonymous(*)(2011-08-09 03:08:10)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Гораздо быстрее и проще открыть книжку по дискретной математике и прочитать несколько глав.

В общем ты признал, что объяснить популярно что такое монада ты не состоянии. Насчет "проще открыть книжку...", понимаешь прежде чем открыть книгу я хотел бы понять в общих чертах что это и нужно ли мне это вообще.

А ты предлагаешь мне вспомнить матан, изучить дискретную математику и хаскель, что бы понять, что такое монады и сделать вывод нужны ли мне они в повседневной практике?

Ax-Xa-Xa(*)(2011-08-10 23:34:34)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>В общем ты признал, что объяснить популярно что такое монада ты не состоянии. ?
>Насчет "проще открыть книжку...", понимаешь прежде чем открыть книгу я хотел бы
>понять в общих чертах что это и нужно ли мне это вообще.
Я уже приводил популярное объяснение выше:

>С точки зрения программиста монада это абстрактный контейнер с тремя функциями.
>map - ...
>unit - ...
>join - ...
Что тебе непонятно? Ты не знаешь что такое коробка, гвоздь и шуруп? Непонятно что такое int и float?

>А ты предлагаешь мне вспомнить матан, изучить дискретную математику и хаскель,
>что бы понять, что такое монады и сделать вывод нужны ли мне они в повседневной
>практике?
Могу тебя заверить, что для использования монад в повседневной практике их глубокое понимание совсем не обязатяльно.

anonymous(*)(2011-08-11 03:00:34)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>> В общем ты признал, что объяснить популярно что такое монада ты не состоянии. ?
> Я уже приводил популярное объяснение выше:
>> С точки зрения программиста монада это абстрактный контейнер с тремя функциями. map - ... unit - ... join - ...
> Что тебе непонятно?

Дад, а зачем мне этот контейнер?

Ax-Xa-Xa(*)(2011-08-11 09:22:48)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.124 Safari/534.30
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Дад, а зачем мне этот контейнер?
Для вычислений с обработкой отсутствующих значений, вычислений с несколькими результатами, для последовательных вычислений и вычислений с побочными эффектами, реализации парсеров, оптимизации.

Конкретные примеры приводятся выше и я еще давал ссылку про монады в эрланге, там довольно простые примеры.

anonymous(*)(2011-08-11 11:29:34)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>> Дад, а зачем мне этот контейнер?
> Для вычислений с обработкой отсутствующих значений, вычислений с несколькими результатами, для последовательных вычислений и вычислений с побочными эффектами, реализации парсеров, оптимизации.

Ну вот уже ближе к телу.))) Итак попробуем дать определение:

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

Ну как, пойдет? Или бред?

anonymous(*)(2011-08-11 13:35:06)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Кстати, вроде получилось написать асинхронный OTP TCP сервер и даже echoсервер с его использованием заработал.

Из плюсов:

Реализацию конечно не придумана мной, а выдрано в творческом парсинге кодов мойшевеба. Но так как упрощена, то легко читается. Если кому интересно - распишу подробно код комментариями, кое чего поправлю и закину сюда.

anonymous(*)(2011-08-11 13:59:40)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Монада набор связанных функции, для которой можно определить алгоритм вычисления, который может изменять параметры и последовательность вызова функций в наборе в зависимости от результата вызова предыдущей функции или начальных параметров.
Слова вроде-бы все понятные, а в итоге получился какой-то мутный поток сознания. Самый лучший способ разобраться в том что это такое с программистской точки зрения - попробовать монады на практике. Тебе религия не позволяет поставить хаскелль или erlng+erlando и ввести примеры?

anonymous(*)(2011-08-11 14:14:53)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> Тебе религия не позволяет поставить хаскелль или erlng+erlando и ввести примеры?

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

anonymous(*)(2011-08-11 14:23:31)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>Если кому интересно - распишу подробно код комментариями, кое чего поправлю и закину сюда.
Закидывай, конечно. Может свое поделие перепишу по-нормальному.

anonymous(*)(2011-08-11 14:33:35)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

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

anonymous(*)(2011-08-11 14:36:43)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

уже ищут на работу кошек  http://juick.com/dmz/1352705#18

anonymous(*)(2011-08-11 14:39:47)

Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> уже ищут на работу кошек  http://juick.com/dmz/1352705#18

Зря они кстати вилку не пишут, я вот например даже задумываться над отсылкой им резюме не стал. А была бы вилка, кто его знает, может мы всё жизнь друг друга искали.)))

anonymous(*)(2011-08-11 15:58:58)

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

>уже ищут на работу кошек  http://juick.com/dmz/1352705#18
Только про зарплату - тишина.

anonymous(*)(2011-08-11 15:59:24)

Opera/9.80 (Windows NT 5.1; U; en) Presto/2.7.62 Version/11.01
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

В общем выкладываю результат двухнедельного изучения Эрланга. Если кто распарсил что это и готов конструктивно покидаться тапочками (покритиковать код), с удовольствием буду отмахиваться (давать пояснения).)))

erlang
-module(echoserver).
%% Пример Echo сервера с применением асинхронного OTP/Erlang TCP сервера
-export([start/0, payload/1]).

%% Запуск Echo сервера
start() ->
    Options = [{name, {local, ?MODULE}}, {port, 7000}],
    tcp_server:start_link(Options, {?MODULE, payload}).

%% Реализация протокола Echo
payload(Socket) ->
    case gen_tcp:recv(Socket, 0) of
        {ok, Data} ->
            gen_tcp:send(Socket, Data),
            payload(Socket);
        {error, closed} ->
            ok
    end.
 

Ax-Xa-Xa(*)(2011-08-14 00:03:19)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

erlang
-module(tcp_server).
%% Асинхронный OTP/Erlang TCP сервер
-export([start_link/2]).
%% Использую поведение get_server
-export([init/1, terminate/2, code_change/3,
         handle_call/3, handle_cast/2, handle_info/2]).

-define(TCP_OPTIONS, %% Параметры TCP
    [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).

-record(state, { %% Параметры и состояние сервера
        %% параметры
        name,           %% Имя процесса сервера
        ip,             %% IP адрес
        port,           %% Номер порт
        payload,        %% Функция реализующая серверный протокол
        pool_size,      %% Кол-во акцепторов ожидающих акцепторов
        %% состояние
        lsocket,        %% Серверный "слушающий" сокет
        acceptors,      %% Пул акцепторов ожидающих входящих подключений
        client_count=0  %% Количество текущих клиентских подключений
       
    }).


%% Запуск сервера
%% Options - список параметров заданных как кортеж {Key, Value}
%% Функция реализующая серверный протокол принимающая параметром сокет
start_link(Options, Payload) ->
    State = #state{ %% параметры по умалчиванию
                    ip={127,0,0,1}, port=5007, pool_size=16},
    NewState = parse_options(Options, State#state{payload=Payload}),
    %% Запускаю серверный процесс как gen_server с параметром ReadyState
    case NewState#state.name of
        undefined -> %% запуск процесса без имени
            gen_server:start_link(?MODULE, NewState, []);
        _ -> %% запуск процесса с заданным именем
            gen_server:start_link(NewState#state.name, ?MODULE, NewState, [])
    end.
   

%% Разбор параметров запуска сервера
parse_options([{Key,Value}|Rest], State) ->
    %% Разбираю ведущий элемент списка параметров
    case Key of
        name  -> parse_options(Rest, State#state{name=Value});
        ip  ->   parse_options(Rest, State#state{ip=Value});
        port  -> parse_options(Rest, State#state{port=Value});
        _ ->     parse_options(Rest, State)
    end;
parse_options([], State) -> %% разбор параметров закончен
    State.


%% Инициализация процесса сервера
init(State) ->
    %% будем контролировать завершение бочерних процессов
    process_flag(trap_exit, true),
    %% Параметры создания серверного TCP сокета тривиальные
    Opts = [binary, {packet, 0}, {active, false}, {reuseaddr, true}],
    %% Создаю серверный сокет
    case gen_tcp:listen(State#state.port, Opts) of
        {ok, LSocket} -> %% Если все хорошо создаю пул акцепторов
            {ok, create_acceptors(State#state{lsocket=LSocket})};
        {error, Reason} -> {stop, Reason} %% Завершение с выдачей ошибки
    end.


%% Завершение процесса сервера
terminate(_Reason, State) ->
    gen_tcp:close(State#state.lsocket).


%% Создаю пул акцепторов
create_acceptors(State=#state{pool_size=Cnt, lsocket=LSocket, payload=Payload}) ->
    %% Новый state с проинициализированным набором для пула акцепторов
    NewState = State#state{acceptors=sets:new()},  
    create_acceptors(Cnt, LSocket, Payload, NewState).
%% Рекурсивная часть формирует пул акцепторов
create_acceptors(Cnt, LSocket, Payload, State=#state{acceptors=Pool}) ->
    case Cnt of
        0 -> State; %% Формирование пула закончено
        _ ->
            %% создаю процесс акцептора
            Pid = tcp_acceptor:start_link(self(), LSocket, Payload),
            %% формирую из старого новый пул содержащий Pid созданного процесса
            NewPool = sets:add_element(Pid, Pool),
            %% возвращаю состояние с новым пулом акцепторов
            create_acceptors(Cnt-1, LSocket, Payload, State#state{acceptors=NewPool})
    end.

   
%% Заменяет заданный Pid на новый в пуле акцепторов
replace_acceptor(OldPid,
                 State=#state{acceptors=Pool,
                              lsocket=LSocket, payload=Payload}) ->
    case sets:is_element(OldPid, Pool) of
        true ->
            %% создаю процесс нового акцептора
            Pid = tcp_acceptor:start_link(self(), LSocket, Payload),
            NewPool = sets:add_element(Pid, sets:del_element(OldPid, Pool)),
            State#state{acceptors=NewPool};
        false ->
            State
    end.

%% Увеличивает счетчик клиентских подключений
increment_client_count(State) ->
    ClientCount = State#state.client_count+1,
    State#state{client_count=ClientCount}.

%% Уменьшает счетчик клиентских подключений
decrement_client_count(State) ->
    ClientCount = State#state.client_count-1,
    State#state{client_count=ClientCount}.


%% Асинхронный вызов
handle_cast(Request, State) ->
    case Request of
        {accepted, Pid} ->  %% Акцептор принял подключение
            %% заменяем его в пуле на новый и увеличиваю счетчик подключений
            {noreply, replace_acceptor(Pid, increment_client_count(State))};
        _ -> %% другие вызовы не обрабатываем
            {noreply, State}
    end.

%% Информационное сообщение
handle_info(Info, State) ->
    case Info of
        {'EXIT', _Pid, normal} ->   %% Процесс акцептора завершился
            {noreply, decrement_client_count(State)};
        %% Процесс акцептора завершился c ошибкой accepting_error
        {'EXIT', Pid, {accepting_error, Reason}} ->
            error_logger:error_report([{Pid, accepting_error}, Reason]),
            {noreply, State};
        %% Процесс акцептора завершился c ошибкой
        {'EXIT', Pid, Reason} ->
            error_logger:error_report([{Pid, payload_error}, Reason]),
            {noreply, decrement_client_count(State)};
        _ -> %% другие сообщения не обрабатываем
            {noreply, State}
    end.


%% Синхронный вызов
handle_call(_Request, _From, State) ->
    {noreply, State}. %% не используем

%% Уведомление о изменении кода
code_change(_OldVsn, State, _Extra)
    -> {ok, State}.

 

Ax-Xa-Xa(*)(2011-08-14 00:04:50)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
[#] [Добавить метку] [Редактировать] Ответ на: Никто случайно не хочет Эрланг поизучать, от anonymous 2011-08-03 20:24:00
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

erlang
-module(tcp_acceptor).
%% Акцептор для применения с tcp_server
-export([start_link/3, init/3]).

%% Запуск процесса акцептора
start_link(Server, Listen, Loop) ->
    proc_lib:spawn_link(?MODULE, init, [Server, Listen, Loop]).

%% Инициализация процесса акцептора
init(Server, LSocket, Payload) ->
    case catch gen_tcp:accept(LSocket) of
        {ok, Socket} -> %% Уведомляю, что акцептор принял подключение
            gen_server:cast(Server, {accepted, self()}),
            case Payload of
                {Module, Function, Args} -> %% модуль:функция с параметром
                    erlang:apply(Module, Function, [Socket | Args]);
                {Module, Function} -> %% модуль:функция
                    Module:Function(Socket);
                {Function} -> %% функция
                    Function(Socket)
            end;
        {error, closed} ->  %% LSocket закрылся
            exit(normal);
        {error, timeout} -> %% таймаут
            init(Server, LSocket, Payload);
        Reson -> %% Ошибка
            exit({accepting_error, Reson})
    end.
 

Ax-Xa-Xa(*)(2011-08-14 00:05:37)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Вроде нормально написано, только почему здесь

erlang

%% Запуск процесса акцептора

 start_link(Server, Listen, Loop) ->

     proc_lib:spawn_link(?MODULE, init, [Server, Listen,

 

не используешь gen_server?

anonymous(*)(2011-08-17 00:41:12)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

Да и вообще, задумался переходить ли на мойшевеб с yaws или забить, какие подводные камни? Последний стабильный мойша 1.5.2, а что слышно про релиз 2.0, тот что активно пилят?

anonymous(*)(2011-08-17 00:50:12)

Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
avatar
Скрыть

Re: Никто случайно не хочет Эрганг по изучать,

> не используешь gen_server?
Как я писал это результат распаривания Мойши. Я просто упрастил немого код и отвязал от своего сокета Мойши. Пул акцеторов в мойше точно такой же.

Почему не ген_сервер? А зачем генсервер? процессы акцепторов полностью констролируются процесом сервера. Патерн генсервера предполагает насколько я понял, что его жизнью и смертью занимается супервизор причем использую примитивный алгоритм "упало=поднял". Здесь такой компот не пойдет, алгоритм совсем другой другой.

Ax-Xa-Xa(*)(2011-08-18 18:34:38)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!