LINUX.ORG.RU

Вышел 2-й выпуск журнала «Практика функционального программирования»

 , , ,


1

0

Вышел в свет второй выпуск журнала «Практика функционального программирования».

Центральная тема второго выпуска журнала — демонстрация применения функционального программирования в реальных, а не академических проектах.

Первые четыре статьи — Дмитрия Зуйкова, Дмитрия Астапова, Сергея Зефирова в соавторстве с Владиславом Балиным, и Алексея Отта — вытаскивают на поверхность «кухню» нескольких компаний. Статьи демонстрируют, что функциональные языки находят применение в промышленном программировании в самых разных нишах. Конечно, использование «нестандартных» языков накладывает на проекты некоторые сложно оценимые риски, и далеко не все из них рассмотрены в статьях. Но если статьи этого номера позволят развеять хоть часть сомнений, мифов и предрассудков и поднять дискуссию о применимости функциональных языков в промышленном программировании на новый уровень, мы будем считать свою задачу выполненной.

Статья Александра Самойловича рассматривает создание на языке Erlang игрушечного, но практичного проекта — рекурсивного многопоточного обходчика сайтов. К третьему выпуску журнала мы планируем подготовить ещё несколько статей про Erlang.

Завершающая статья Романа Душкина в большей степени ориентирована на теорию: она познакомит вас с концепцией алгебраических типов данных (АТД) в Haskell и других функциональных языках.

>>> Подробности

★★★★★

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

Например, чтобы потом народ на работу нанять. :)

pitekantrop ★★★
()
Ответ на: комментарий от ugoday

> Сложно представить язык ещё проще чем лисп.

Внешняя простота ещё не говорит о лёгкости его применения. Мы мыслим императивно - весь наш быт представлен последовательностями действий. Вопрос: зачем ломать мозг рекурсией, когда есть более простые и понятные алгоритмы? Не говоря уже о крышесносе "отсутствие побочных эффектов". Это белка в колесе - без побочных, а нам нужны эффекты от действий. Вощем, извечный спор между разумом и ФП.

matumba ★★★★★
()
Ответ на: комментарий от satanic-mechanic

Нет никаких намёков. В то время, когда Лёша прекратил заниматься "Дозором", а я, соответственно" -- "Тропой" и прочим "Z-2", дела с прордажами идти не важно. Сейчас, судя по открытым источникам (а иных у меня почти нет), дело с "Дозором" выправилось. В 2006м году его как-то хорошо напродавали на все вертикальные рынки. Сколько в том было "политических" продаж. а сколько "жизненно-необходимых" я не знаю, но поелику давно живу в России и давно загнимаюсь безопаасностью вообще и разработкой всяческого "сертифицированного" дерьма^Wсофта в частности, то могу проредположить, что политики там больше.

Собственно, я тут высказал тезис о независимости технологических решений от коммерческого успеха. А на российских рынках -- тем более.

gns ★★★★★
()
Ответ на: комментарий от matumba

> Мы мыслим императивно

Я рад за вас. А вот мне конструкция вида

[code] x=x+1 [/code]

Наглухо вынесла мозг. Ибо с нормальной человеческой точки зрения это уравнение совершенно безумно.

> Вопрос: зачем ломать мозг рекурсией,

Ответ, затем, что многие процессы черезвычайно легко описываются на рекурсивном языке, а на императивном --- длинно нудно и с матюгами.

...

всякая чушь поскипана

...

> Вощем, извечный спор между разумом и ФП.

извечный спор между кастрированным бэйсиком разумом и ФП.

ugoday ★★★★★
()
Ответ на: комментарий от gns

ну насчет продаж ты погорячился - Тропа и З-2, да - продавались плохо, а вот продажи Дозора постоянно росли, что в 2004-м, что в 2005-м... Да и по фичам мы сильно отличались от конкурентов - практически все компании реально его использовали, а не только по политическим мотивам - я постоянно с клиентами общался

ott ★★★★★
() автор топика
Ответ на: комментарий от ugoday

> мне конструкция вида

> [code] x=x+1 [/code]

> Наглухо вынесла мозг. Ибо с нормальной человеческой точки зрения это уравнение совершенно безумно.

Для таких, как ты, придумали Паскаль: x := x+1

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Что за гадкие паскалефобные коннотации?

ugoday ★★★★★
()
Ответ на: комментарий от pitekantrop

> Ну почитай ещё отчёты CUFP (http://cufp.galois.com/).

Спасибо, порж^Wпочитал.

В отчетах по ссылке все та же старая песня: DSL, да моделирование аппаратуры (VHDL), да академическая жвачка.

И потом, если требуется специально _доказывать_, что-де "функциональные языки могут быть не целью, но средством" (цитата с сайта) - значит, что-то не то в консерватории? Нэ?

Kuka ★★
()
Ответ на: комментарий от Kuka

Jane Street Capital - использует окамл в трейинге, Credit Suisse - насколько я помню тоже. Erricson использует в телефонных станциях

это все академическая жвачка?

ott ★★★★★
() автор топика
Ответ на: комментарий от Kuka

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

ugoday ★★★★★
()
Ответ на: комментарий от matumba

> Мы мыслим императивно - весь наш быт представлен последовательностями действий.

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

Да, кстати, "разбить каждое" звучит натуральнее, чем "считать до трёх, каждый раз разбивая яйцо", не так ли? :)

pitekantrop ★★★
()
Ответ на: комментарий от ugoday

> какого рода программа должна быть написана в рамках ФП, чтобы ты признал ФП хорошим, годным для продакшана?

Морда к БД же.

А мне было бы интересно что-нибудь числодробильное.

tailgunner ★★★★★
()
Ответ на: комментарий от matumba

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

psv1967 ★★★★★
()
Ответ на: комментарий от anonymous

> > Ну, к примеру, работа со строками та же, насколько помню. Надо еще раз открывать книжечку про лисп что начинал читать. В общем, хочу питон, только с синтаксисом скобочками как у лиспа, понимаешь? Чтоб он был хакбл и нацелен на функциональное программирование всем своим синтаксисом.

> Как бы вам сюда clojure.org. Вот тут[1] прямо сравниваются элементарные синтаксические конструкции clojure и python.


> [1] http://groups.google.com/group/clojure/browse_thread/thread/d5e041cb8e4fd1c4/.. .


Класс! Спасибо.

kost-bebix ★★
()
Ответ на: комментарий от gns

> Собственно, я тут высказал тезис о независимости технологических решений от коммерческого успеха. А на российских рынках -- тем более.

Вот теперь это стало более очевидно. Спасибо и извините за возможно показавшимся резким тон...

satanic-mechanic
()
Ответ на: комментарий от ott

> http://haskelldsp.sourceforge.net/ ?

Что-то похожее, да. Только уже доведенное до ума и сравненное по скорости с Си или Фортраном, а то фраза "I have tested these routines, but not extensively" как бы намекает, что проект очень молодой :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Мне бы что-нибудь побыдлее :)

А в чём вообще сложность? sql-запрос к БД декларативен. Описание представления результата запроса на клиенте декларативно по сути тоже. таким образом наш интерфейс к БД сводится к преобразованию сложных структур данных. Вполне себе фп задача.

ugoday ★★★★★
()
Ответ на: комментарий от ott

> Jane Street Capital - использует окамл в трейинге

дык там сплошная математика, для расчетов-то функциональное программирование - самое то, никаких сайд-эффектов, сплошная красота. Вы нам что-нибудь более реальное и более сложное, завязанное разные технологии - например, формочку к БД в ГУИ :)

anonymous
()
Ответ на: комментарий от ugoday

> sql-запрос к БД декларативен. Описание представления результата запроса на клиенте декларативно по сути тоже. таким образом наш интерфейс к БД сводится к преобразованию сложных структур данных.

Я же написал - морда. Т.е. GUI. Навороченный GUI, сделанный средствами функционального языка. Потому что почти все примеры успешного использования ФП, которые мне попадались - это как раз "преобразования сложных структур данных". А меня интересует применение ФП к быдлокодерской задаче типа "налабать морду".

tailgunner ★★★★★
()
Ответ на: комментарий от ott

Как-то продавался... Как на "вертикальном рынке" появилось много денег -- стал продаваться лучше и даже "совсем хорошо". :) Если товар купили по "политическим мотивам", то это не значит, что его не используют (хотя я и такое видел).

Дозор -- хороший продукт, чего уж там скромничать...

gns ★★★★★
()
Ответ на: комментарий от pitekantrop

> Хочу поесть, для этого мне нужно приготовить яичницу. Чтобы приготовить яичницу, мне нужно разогреть сковородку, налить туда масла и пожарить яйца. Чтобы пожарить яйца, мне нужно достать 3 яйца из холодильника, разбить каждое над сковородкой, посолить... и т.д.

Ээ, ну это полностью императивное описание. Какбы, чтобы приготовить яичницу мне нужно выполнить определенный _порядок_ действий (запятая у вас исполняет роль операции "а затем"), а это, извините, уже попахивает несвежими монадами.

> Да, кстати, "разбить каждое" звучит натуральнее, чем "считать до трёх, каждый раз разбивая яйцо", не так ли? :)

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

anonymous
()
Ответ на: комментарий от anonymous

> Вы нам что-нибудь более реальное и более сложное, завязанное разные технологии - например, формочку к БД в ГУИ :)

http://cufp.galois.com/2009/report/report.html#the-big-board - продвинутая риал-тайм викимапия с чатом для всяких пожарников.

pitekantrop ★★★
()
Ответ на: комментарий от anonymous

> Ээ, ну это полностью императивное описание.

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

> определенный _порядок_ действий

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

ugoday ★★★★★
()
Ответ на: комментарий от psv1967

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

Вы что из циклов - только сишный (++) for знаете? Я циклы в быту постоянно использую - рекурсии, как-то не очень. Для меня намного естественнее - "пробежать 10 кругов" (кстати, счетчик в этой ситуации используется явно), "работать до 17.30", "читать до конца страницы", "выполнить все задачи в todo листе" и тд.

> ну нету счетчиков циклов никаких "в нашем быту".

Есть и много, просто они настолько естественны, что их особо и не замечаешь.

anonymous
()
Ответ на: комментарий от ugoday

> http://qthaskell.berlios.de/

> Эта штука сделает тебя счастливым.

Не сделает. По двум причинам: 1) это всего лишь привязки к ОО-тулкиту; 2) "Latest qtHaskell release: v1.1.2 (September 2008) This is the second preview release of qtHaskell". Ну еще я не люблю Хаскел, но это уже мелочи :) Про lablgtk для Ocaml напоминать тоже не надо.

Есть какие-нибудь Ъ-ФП либы для GUI? Пусть у них на нижнем уровне будет qt, wx или gtk, но только на нижнем уровне, чтобы был виден ФП-подход к GUI.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

web-gui в качестве примера пойдет? на последней странице моей статьи есть скриншот интерфейса, который как раз работает с БД

ott ★★★★★
() автор топика
Ответ на: комментарий от ugoday

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

Ну распиши это "правильно" на Haskelle (я его немного знаю, думаю пойму).

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

True. А вот с остальным, что делать? Т.е. пожарить яйца, я смогу только после того, как разогрею сковородку и налью туда масло, разбить яйца над сковородкой можно только, после того как достанешь их из холодильника, ну и посолить только после того, как проделаешь все остальное. Явно виден порядок выполнения - это чистый императив, кстати это можно еще и на прологе написать, на нем даже удобней получится.

anonymous
()
Ответ на: комментарий от r

> Сча мрачную шутку нашли в о всех версиях - называется try finally catch finally да-е-мое-finally. > Надеюсь будет фикс для ветки 2.7 ASAP, а то я скалу запихнул уже в продакшен:)

А можно точнее что за "штука" ? А то я тоже собираюсь её в продакшен запускать.

Darkman ★★★
()
Ответ на: комментарий от tailgunner

http://haskell.cs.yale.edu/FranTk/

FranTk (pronounced "frantic") is a declarative library for building GUIs in Haskell. It's designed to allow you to build your application in a declarative manner. It uses behaviours and events, concepts from Conal Elliot's Functional Reactive Animation. These allow you to model a system over time. Events are used to describe values that occur discretely, such as button clicks. Behaviors are continuous quantities that vary over time. They are used to represent the state of an application. Events and behaviors can interact. For instance, we can have a behavior that changes on every event. You can then render this application on to an interface.

ugoday ★★★★★
()
Ответ на: комментарий от ott

> web-gui в качестве примера пойдет? на последней странице моей статьи есть скриншот интерфейса, который как раз работает с БД

там scheme - это не чистое фп - с таким же успехом можно было показать web-gui на питоне, меня интересуют чистые функциональные языки - Haskell, CLean.

anonymous
()
Ответ на: комментарий от anonymous

Явно виден порядок выполнения - это чистый императив,

тогда и

sin(exp(log(4)))

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

Тебе не кажется, что с твоим определением императивности что-то не так?

ugoday ★★★★★
()
Ответ на: комментарий от tailgunner

Есть какие-нибудь Ъ-ФП либы для GUI?

denis@laptop:~$ ls /usr/lib/erlang/lib/wx-0.98.2/examples/demo/
demo.beam             ex_choices.beam         ex_gauge.beam     ex_pickers.beam     ex_sizers.beam          ex_textCtrl.beam
demo.erl              ex_choices.erl          ex_gauge.erl      ex_pickers.erl      ex_sizers.erl           ex_textCtrl.erl
ex_button.beam        ex_cursor.beam          ex_grid.beam      ex_popupMenu.beam   ex_slider.beam          ex_treeCtrl.beam
ex_button.erl         ex_cursor.erl           ex_grid.erl       ex_popupMenu.erl    ex_slider.erl           ex_treeCtrl.erl
ex_canvas.beam        ex_dialogs.beam         ex_listCtrl.beam  ex_radioBox.beam    ex_splitterWindow.beam  image.jpg
ex_canvas.erl         ex_dialogs.erl          ex_listCtrl.erl   ex_radioBox.erl     ex_splitterWindow.erl
ex_canvas_paint.beam  ex_frameutilities.beam  ex_notebook.beam  ex_sashWindow.beam  ex_static.beam
ex_canvas_paint.erl   ex_frameutilities.erl   ex_notebook.erl   ex_sashWindow.erl   ex_static.erl
isden ★★★★★
()
Ответ на: комментарий от ugoday

>> Изучить это всей жизни не хватит.

> Бедняжка, ты смертельно болен и пишешь нам из хосписа?

Из отделения реанимации, а что?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Изучить это всей жизни не хватит. --- Твои слова?

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

> Ээ, ну это полностью императивное описание.

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

> несвежими монадами

Аргументы весомее эпитетов будут?

> Это в дурацких языках с счетчиком так делается, в нормальных императивных, ООП языках будет - для всех яиц разбить.

foreach - это всё равно цикл, т.е. "брать по одному и разбивать", а map - это именно "разбить каждое". Цикл - это последовательная обработка, а map можно выполнять параллельно.

Да, и как насчёт фильтрации по условию?

> И кстати, работа со списками и коллекциями, она не только в функциональных языках есть.

Сейчас очень многие идеи функционального программирования в традиционные языки перекочёвывают.

pitekantrop ★★★
()
Ответ на: комментарий от anonymous

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

А противоречие то в чём? Результат одной операции идёт на вход другой. Или ты думаешь, что ФП позволяет отказаться от причинно-следственных связей?

pitekantrop ★★★
()
Ответ на: комментарий от anonymous

> Вы что из циклов - только сишный (++) for знаете? Я циклы в быту постоянно использую - рекурсии, как-то не очень. Для меня намного естественнее - "пробежать 10 кругов" (кстати, счетчик в этой ситуации используется явно), "работать до 17.30", "читать до конца страницы", "выполнить все задачи в todo листе" и тд.

Хм. "слава роботам"? :) все приведенное насилие над разумом человека есть. Работать надо пока не сделаешь или пока видишь что делать. Бежать надо не "10 кругов" а "в темпе 150 ударов сердца в минуту до выделения нужного кол-ва пота"... и да, что такое "читать до конца страницы"? :)

Про тодо лист уже упомянули ленивый порядок вычисления вообще решает проблему тодо листа и что в нем делать автоматически. Главное цели указывать, а не морально устаревший список задач... а то так недалеко до эпической победы "цеха правых перчаток в социалистическом соревновании".

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.