Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чудеса функционального программирования

361
12 марта 2008 года
Odissey_
661 / / 19.09.2006
Просто хочу вас познакомить с некоторыми удивительными вещами (возможно кого нибудь тематика заинтересует =))

Собственно, кратенько два обзора:

3D шутер Frag.
Создан на Haskell. Несмотря на всю его "ленивость" на нем можно писать и такие вот игрушки. Шутер очень похож на Quake3 и написан одним человеком. В нем использовался ранее разработанный DSL Yampa -- язык для гибридных систем с концепцией реагирующих систем (Functional Reactive Programming - FRP). Вся похожесть вытекает из поддержки The Quake 3 BSP level format, Q3Map2, and the MD3 format for models and animations. На странице можно глянуть скриншоты, симпатично.

Мозаический менеджер окон xmonad. То же Haskell, за ссылку спасибо squirl.
Ну конечно самое удивительное для программиста то, что первая версия была написана в 500 строк кода =). А так мозаический менеджер окон отличается от классических тем, что области окон не перекрываются -- пора выбрасывать мышь =). Здесь можно глянуть видеоролик , а здесь полюбоватся скриншотами.
Так же нашлась статья по его установке Как бросить обычные менеджеры окон и начать жить.
240
12 марта 2008 года
aks
2.5K / / 14.07.2006
Крута. )
2
14 марта 2008 года
squirL
5.6K / / 13.08.2003
блинн... я скоро возьмусь изучать Haskell :)
361
14 марта 2008 года
Odissey_
661 / / 19.09.2006
Мне кажется что изучать функциональное программирование скоро станет не только интересно, но и необходимо. А все из-за тенденции к усложнению многоядерных систем. Вот есть хорошое введение в Erlang , в котором описывается почему раньше данный подход был мало востербован, и почему сейчас становится все более нужен. Статья носит популярный характер, без выпендрежа =)
337
14 марта 2008 года
shine
719 / / 09.06.2006
Вопрос по самому декларативному программированию: как это вообще может работать? Как мы можем задавая конечное число пар аргумент/результат получить однозначный и единственноверный ответ?

Например, f(0)=0 и f(1)=1. Функций которые удовлетворяют этим условиям дофига. Как функциональный язык будет угадывать какую именно функцию из этого 'дофига' автор хочет получить?
361
14 марта 2008 года
Odissey_
661 / / 19.09.2006
А что он должен угадывать?
Функция имеет тело, то есть описание зависимости выходных параметров от входных. Такая зависимость может быть задана как аналитически, графичекси так и таблично.

Здесь основное отличие в том что используется модель вычисления без состояний -- функция будет одинаково работать на одинаковых входных данных.
3
15 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: squirL
блинн... я скоро возьмусь изучать Haskell :)


А я вот постигаю функциональное программирование на Python.
Можно комбинировать: там где не могу изобразить функционально или питон не позволяет, скатываюсь до ООП... :)

Говорят еще JavaScript можно использовать как функциональный ЯП.

2
15 марта 2008 года
squirL
5.6K / / 13.08.2003
элементы ФП есть даже в Perl - замыкания называются :) ФП везде!
337
15 марта 2008 года
shine
719 / / 09.06.2006
Пойду курить маны. :)
240
15 марта 2008 года
aks
2.5K / / 14.07.2006
Цитата: Green

Говорят еще JavaScript можно использовать как функциональный ЯП.


Не то чтоб как функцинальный, но некоторые элементы ФП там есть.

337
15 марта 2008 года
shine
719 / / 09.06.2006
Odissey_, а вообще какие ощущения от использования ФЯ? Можеш сравнить с каким-нибудь другим языком/методикой? Понимаю, что это субъективно, но все-таки...
240
15 марта 2008 года
aks
2.5K / / 14.07.2006
Ну это совсем другая парадигма по сравнению с императивным программированием. Далеко не единственная совсем другая. Но если заняться ей после императивных языков будет казаться очень необычной. И соотвественно уже как то расширить взгляд на методики програмирования в целом. Хотя бы с дух разных сторон.
12
13 апреля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: shine
Можеш сравнить с каким-нибудь другим языком/методикой? Понимаю, что это субъективно, но все-таки...


Ресурсов жрет значительно меньше по сравнению в тем же PHP интерпретатором. Если в PHP для удержания коннекта на стриминге уходит несколько мегабайт, то тут 50кБ это уже типа вау как много. Как следсвие куча съкономленых ресурсов, на том же железе я могу обработать больше запросов.

Лично для меня это сейчас главное.

63
13 апреля 2009 года
Zorkus
2.6K / / 04.11.2006
Цитата: squirL
элементы ФП есть даже в Perl - замыкания называются :) ФП везде!


В некотором урезанном виде замыкания есть в Java (в виде локальных классов), и, кажется, анонимные делегаты C£ тоже что-то похожее.
Но вообще - согласен с мнением, что хаскелл - самый зрелый и мощный ФЯ из существующих чисто функциональных языков.
Можно сказать - лексическая оболочка над типизированным лямбда-исчислением ;)

341
13 апреля 2009 года
Der Meister
874 / / 21.12.2007
Цитата: Zorkus
В некотором урезанном виде замыкания есть в Java (в виде локальных классов), и, кажется, анонимные делегаты C£ тоже что-то похожее.

Анонимные делегаты замыкаются на контекст, т. е. могут быть использованы функциями высшего порядка полноценно. Только вот синтаксис у них больно нечеловеческий. В си паунд 3 введены нормальные лямбда-выражения.
Мне вот лично всем ФП нравится, но несколько смущает отсутствие (или просто моё незнание?) вменяемых методик проектирования систем для чистых ФЯП. С другой стороны, после OCaml и Nemerle возвращаться к традиционному ООП как-то не хочется :)

5
13 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Der Meister
С другой стороны, после OCaml и Nemerle возвращаться к традиционному ООП как-то не хочется :)


Да, C# на фоне Nemerle смотрится очень слабо.
Лямбда-выражения в C# это отстой. Нормального функционального типа (аля int*string -> float) так и не сделали, а то что сделали, порой совсем не нужно. Их использование оправданно только в контексте LINQ, в остальном полный бесполезняк.

З.Ы. Почитываю книжку по Хаскеллю в свободное время.

63
13 апреля 2009 года
Zorkus
2.6K / / 04.11.2006
Цитата: hardcase
Да, C# на фоне Nemerle смотрится очень слабо.
Лямбда-выражения в C# это отстой. Нормального функционального типа (аля int*string -> float) так и не сделали, а то что сделали, порой совсем не нужно. Их использование оправданно только в контексте LINQ, в остальном полный бесполезняк.

З.Ы. Почитываю книжку по Хаскеллю в свободное время.


Я тоже, только вот его маловато (времени).
Учитывая замечания Green и Der Meister - пока что Python/Ruby мне кажутся более практическими, что ли, языками (на Раби я писал несколько утилит для обработки CSV-файлов). А Хаскелл - языком, изучая который можно понять все тонкости и принципы ФП - потому что это и есть кристаллизация всех принципов ФП, но несколько сложноватым для практического применения.
У меня скудный опыт в ФП, но приведу один маленький пример.

Год назад я уговорил препода по ЯП в универе попробовать Хаскелл вместо Пролога, который он обычно до этого давал.
Вещи вроде complex list/map/.. processing писались буквально в 3 строчки. Буквально (и выглядели по человечески красиво и по программистски элегантно). Но потом понадобилось сделать тривиальнейшую вещь - чтение из текстового файла (ленивое, конечно), вычисление чего-то и запись результата в файл.
Логика обработки была написана за минут 15 (по сути, потраченных на поиск и изучение логики работы нескольких стандартных функций). А вот работа с файлами... :rolleyes:
Я потратил день на чтение статей - что такое монада, сначала сугубо математических, из теории категорий, потом более приземленных и уже конкретно по хаскеллу.
Ближе к вечеру я решил, что вооружен теоретически и можно смело писать код. Я написал 5 строк, запустил в интерпретаторе. Они не работали, описание ошибки я долго не мог понять. В итоге проблема была кажется в том, что в одном месте "грязный" код (содержащий монады) вызывался из "чистого" (строго функционального, обеспечивающего отсутствие побочных эффектов и проч.), что запрещено в Haskell, где функциональное ядро языка четко отделено от подсистемы ввода-вывода.
Я час гуглил и написал по образцу некоторых примеров что-то работающее (кстати, код тех лабораторных остался, могу показать если кому вдруг станет интересно).

Я конечно, не говорю что я великий знаток хаскелла, не знаю как реализовано в программах указанных выше взаимодействие с системными API - но пока что мне кажется слабым местом (слабым с точки зрения удобства и простоты реализаций многих вещей) - вот эти связки, созданные для организации взаимодействия чистейшего функционального ядра языка и внешних API (событийных, в процедурном/OOP стиле и т.п.)

Надо будет разобраться, как это сделано в Питоне, и почему именно так. Объяснятся ли это тем, что Питон - не чисто функциональный язык, или чем-то еще.

P.S.
http://www.rsdn.ru/article/haskell/haskell_part1.xml
http://www.rsdn.ru/article/haskell/haskell_part2.xml

По этим статьям я пробовал :)
Может, кому пригодится...

12
13 апреля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Der Meister

Мне вот лично всем ФП нравится, но несколько смущает отсутствие (или просто моё незнание?) вменяемых методик проектирования систем для чистых ФЯП.


Мне так думается, что нужно просто смотреть код уже написаных и надежных приложений. Да и материалы то есть, другой вопрос, что в рунете их практически нет. Тут на родном языке порой совершенно не понимаешь, о чем вообще толкует автор, а уж читать на иностранном новые идеи и понятия это вообще труба. Поэтому и кажется, что почитать то нечего. Есть. Но нужно искать и искать, а потом читать и читать, но только на английском.

12
13 апреля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Zorkus

Но потом понадобилось сделать тривиальнейшую вещь - чтение из текстового файла (ленивое, конечно), вычисление чего-то и запись результата в файл.
Логика обработки была написана за минут 15 (по сути, потраченных на поиск и изучение логики работы нескольких стандартных функций). А вот работа с файлами... :rolleyes:


Не знаю, как там в хаскеле. Но вот я беру к примеру схожу проблему которая возникла буквально только что:
http://groups.google.com/group/erlang-russian/browse_thread/thread/39c8c2fb2ae3f2cb?hl=ru

Голову ломать разными монадами совершенно не нужно. Просто понимаешь базовую основу и пишешь.

Вообще меня Erlang очень сильно впечатляет. Там ведь не только сам язык, так сразу идет VM (и как следствие автоматическое портирование приложения на все платформы где VM может работать, а список этот приличный), а так же это еще и OTP где реализовано большая часть того, что может понадобиться в практике уже из коробки. Требуется лишь небольшая обязка callback модулями. Я уже не говорю о потребляемых ресурсах. Достаточно посмотреть на тот же ejabberd или Yaws. И сильно подозреваю, что в ближайшие годы будет расти интерес именно к этому языку (по крайне мере в рунете) как к языку общего назначения в контексте разработки под веб.

12
13 апреля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Zorkus

Вещи вроде complex list/map/.. processing писались буквально в 3 строчки. Буквально (и выглядели по человечески красиво и по программистски элегантно).


Согласен. Сейчас когда я порой пишу PHP код не, да и думается, что вот в Erlang-е вот этот кусок будет в коде и короче и нагляднее и удобнее.

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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог