Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функциональное программирование, или в поисках серебрянной пули 
:(
    Опции темы
Void
Дата 12.10.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



По мотивам ветки Почему все любят C++, я решил нарушить первую заповедь флеймера – "не создавай свои провокационные топики – используй чужие" smile

Налицо расхожее мнение, что функциональные языки являются чисто академическими инструментами, непригодными для решения практических задач, и вообще, все, для чего они нужны – это заваливать нерадивых студентов на экзамене smile
Почему так? Наверное, тут можно выделить несколько наиболее часто встречающихся (и взаимно пересекающихся) доводов:
1) Не нужны они, и все тут. XXX вполне справляется со своими задачами.
2) Программистов, знающих такие языки, очень мало; и, в отличие от, скажем, перехода Java ->C#, пересадить C++-ника на Haskell быстро не получится. И вообще, нормальному человеку надо вывихнуть мозги, чтобы понять такие вещи.
3) Все прекрасно, но у таких языков нет коммерческой поддержки, нормальных средств разработки, и т. д.

Все это в какой-то мере правда… Но:
Не рассматривая собственно ФЯ, как самоцель, многие вещи, широко распространенные среди ФЯ (и, увы, мало популярные в мэйнстриме), кажутся мне весьма полезными, облегчающими и ускоряющими процесс разработки. Например:
  • строгая типизация и вывод типов;
  • функции, как first-class values;
  • карринг;
  • соответствие образцу;
  • элементарные структуры данных на уровне языка (кортежи, списки, etc);
  • мощные средства метапрограммирования;

(Пример языка, попытавшегося совместить это все с классическим императивным и ОО подходом на базе платформы .NET – Nemerle. По первым впечатлениям, очень приятная штука. Другой распространенный функциональный язык – OCaml, также не является чисто функциональным и позволяет использовать императивный и ОО стиль.)

Вопросы, на которые мне хотелось бы получить ответ:

Считаете ли Вы функциональные (и вообще, нетрадиционные) языки применимыми в промышленном программировании, и почему.

Считаете ли Вы полезным движение некоторых современных мэйнстримных языков (например, C#) в сторону ФЯ. Грубо говоря, нужны ли вам эти фичи?

Попробую побыть адвокатом дьявола… тьфу, то есть ФЯ smile

Пока все. Жду помидоров smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LSD
Дата 12.10.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(Void @ 12.10.2005, 21:15)
Пример языка, попытавшегося совместить это все с классическим императивным и ОО подходом на базе платформы .NET – Nemerle.

Для .NET есть компилятор ML-я от MS.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Void
Дата 12.10.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(LSD @ 12.10.2005, 22:18)
Для .NET есть компилятор ML-я от MS.

Знаю, знаю и про SML.NET, и про F#. У Nemerle своя специфика (в частности, ИМХО, гораздо более удобная, чем CamlP4, система макросов. Впрочем, я с ним только только начал разбираться).


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 16.10.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Пощупал вчера ocaml чуток. hello world вывел smile

Цитата(Void @ 13.10.2005, 00:15)
#
# функции, как first-class values;
# карринг;
# соответствие образцу;
# элементарные структуры данных на уровне языка (кортежи, списки, etc);
# мощные средства метапрограммирования;

Первые три пункта слабо понял

вообщем
smile



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Void
Дата 16.10.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Mayk
ОК, поехали по пунктам:

Цитата
# функции, как first-class values;

Это означает, что язык не делает принципиальных различий между функциями и значениями; ф-ции можно передавать в качестве аргументов другим ф-циями, возвращать и т. д. Указатели на ф-ции в C++ не обеспечивают подобной функциональности. Что-то подобное можно делать в C# 2.0, используя делегаты, анонимные методы и дженерики, но громоздкость синтаксиса оставляет желать много лучшего. Это становится понятно при попытке определить такую элементарную вещь, как композиция ф-ций:
Код
let compose f g = fun x -> f(g x)
let identity = compose sin asin

Код
    delegate RetT Func<ArgT, RetT>(ArgT x);
    
    static Func<ArgT, RetT> Compose<ArgT, Ret1T, RetT>
        (Func<Ret1T, RetT> f, Func<ArgT, Ret1T> g) {
        return delegate(ArgT x) { return f(g(x)); };
    }

Причем вывод типов для аргументов Compose работать не будет, и придется каждый раз явно указывать список дженерик-параметров.
Что нужно наворотить на C++, чтобы записать композицию ф-ций, я боюсь даже представить.

Цитата
# карринг;

Ф-ции, примененная к части своих аргументов, возвращает ф-цию с меньшим числом аргументов - уже заданные фиксированны как константы.
Код
let add x y = x + y
let add2 = add 2
print_int add2 3
(* выведет 5 *)

Предыдущий пример можно переписать с использованием карринга:
Код

let compose f g x = f(g x)
let identity = compose sin asin

identity будет иметь тип float -> float - ф-ции принимающей float, и возвращающей float.
Аналогично можно записать оператор дифференцирования:
Код
let deriv f dx x = (f(x +. dx) -. f x) /. dx
let sin' = deriv sin 0.001

Стоит обратить внимание на специфическую запись операторов - с точкой. За все надо платить, и за вывод типов тоже - в OCaml нет перегрузки ф-ций и операторов. Поэтому даже оператор сложения имеет разную форму для целых ("+") и действительных ("+.") чисел. С другой стороны, позволено объявлять любые собственные операторы.

Цитата
# соответствие образцу;

...или pattern matching. Грубо говоря, pattern-matching - это некий аналог switch, способный оперировать не только над целыми числами или строками, а над любыми типами вообще. В сочетании со способностью OCaml к простому и элегантному объявлению сложных структур данных, получается средство для очень наглядной записи массы алгоритмов. Тот примерчик со вставкой в бинарное дерево использует именно сопоставление с образцом.
Вот простой пример, демонстирующий, что switch лекго изображается средствами pattern-matching:
Код
match i with
  0 -> (* do something *)
| 1 -> (* do something *)
| _ -> (* do something else *)

эквивалентно
Код
switch (i) {
case 0: /* do something */ break;
case 1: /* do something */ break;
default: /* do something else */
}

Можно привести пример с определением типа AST арифметического выражения, и вычисления его значения:
Код
type expression =
      Const of float
    | UnaryOp of (float -> float) * expression
    | BinaryOp of (float -> float -> float) * expression * expression
(*типы, перечисленные через "*", обозначают кортеж. Сам кортеж констрируется
перечислением значений через запятую: (2, 3.0) имеет тип int * float.
Тип expression - т. н. вариантный тип (tagged union). *)

let rec eval expr = match expr with
      Const x -> x
    | UnaryOp(f, x) -> f (eval x)
    | BinaryOp(f, x, y) -> f (eval x) (eval y)
(* expr имеет тип: expression -> float *)

Кстати, простейший калькулятор на OCaml пишется строчек в 30.

Как мог, попытался объяснить. При необходимости готов разъяснять и проповедовать дальше smile

Это сообщение отредактировал(а) Void - 16.10.2005, 13:05


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 16.10.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(Void @ 16.10.2005, 17:01)
Это означает, что язык не делает принципиальных различий между функциями и значениями; ф-ции можно
--cbg--

.net 2.0 не видел. но примерно ясно

Цитата(Void @ 16.10.2005, 17:01)
Ф-ции, примененная к части своих аргументов, возвращает ф-цию с меньшим числом аргументов - уже заданные фиксированны как константы.

smile ага! это точо осилил! что-то типа bind_1st из stl smile

Цитата(Void @ 16.10.2005, 17:01)
let compose f g = fun x -> f(g x)

compose(f,g) = f(g,x)
Цитата(Void @ 16.10.2005, 17:01)
let rec eval expr = match expr with
      Const x -> x
    | UnaryOp(f, x) -> f (eval x)
    | BinaryOp(f, x, y) -> f (eval x) (eval y)
(* expr имеет тип: expression -> float *)

Ага, понятно smile

Цитата(Void @ 16.10.2005, 17:01)

Как мог, попытался объяснить. При необходимости готов разъяснять и проповедовать дальше

Ага. Интересно читать smile




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Sardar
Дата 16.10.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Цитата(Void @ 16.10.2005, 12:01)
ф-ции можно передавать в качестве аргументов другим ф-циями, возвращать и т. д.

В JS тоже можно, но механизм немного другой - closures.
Цитата(Void @ 16.10.2005, 12:01)
Ф-ции, примененная к части своих аргументов, возвращает ф-цию с меньшим числом аргументов - уже заданные фиксированны как константы.

Используеться тот же механизм closures smile
Цитата(Void @ 16.10.2005, 12:01)
# соответствие образцу;

Свитчь есть везде. А вот есть ещё вещь интересная для аргументов если я правильно понял, например:
факториал(0) = 1
факториал(n) = n * факториал(n-1);

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

Нa счёт closures в JS, интересная вещь, например здесь активно используеться: http://forum.vingrad.ru/index.php?showtopic=67475

Для Java можно встретить в таких языках как Groovy, полученный байткод затем исполняеться в обычной JVM.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Mayk
Дата 16.10.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(Sardar @ 16.10.2005, 18:47)
факториал(0) = 1
факториал(n) = n * факториал(n-1);

Такое можно и на плюсах в compile-time высчитать smile


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Void
Дата 16.10.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Mayk @ 16.10.2005, 15:16)
compose(f,g) = f(g,x)

Э-э... ты это к чему? smile
Цитата(Mayk @ 16.10.2005, 15:16)
Ага. Интересно читать

Весьма рад smile

Цитата(Sardar @ 16.10.2005, 16:47)
В JS тоже можно, но механизм немного другой - closures.

Кстати, да. Замыкания - фактически непременный атрибут ФЯ, но их эксклюзивной привелегией не являются. Python и Ruby тоже позволяют так обращаться с функциями.
Цитата(Sardar @ 16.10.2005, 16:47)
факториал(0) = 1
факториал(n) = n * факториал(n-1);

Примерно так и определяются ф-ции в Haskell. А в OCaml оно будет так:
Код
let rec fact = function
      0 -> 1
    | n -> n * fact (n - 1)

Практически дословная запись математического опредления факториала smile Но сопоставление с образцом все-таки этим не ограничивается. Такого можно наворотить...


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Mayk
Дата 16.10.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(Void @ 16.10.2005, 20:04)
Цитата (Mayk @ 16.10.2005, 15:16)
compose(f,g) = f(g,x)
Э-э... ты это к чему?

Упс. да так. пробовал вместо g и f написать asin и sin. Пару строчек недоудалял...


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Void
Дата 21.10.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Ссылка в тему:
Почему никто не использует функциональные языки

И заодно UP темы smile Я таки дождусь ответов на вопросы в первом посте, или это никому особо не интересно (только честно smile )?


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LSD
Дата 21.10.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Функциональное программирование имеет место быть, но широкого распространия ему не получить никогда (мое ИМХО). Обосную чуть погодя.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
setq
Дата 22.10.2005, 08:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











тема-то интересная, а сказать нечего smile
  Вверх
Sardar
Дата 22.10.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



Ну вот, теперь флеймить начнём smile

Сам изучал для себя Haskell и Lisp. Мощно, хотя синтаксис явно накурившись придумывали smile
Одна проблема, я не могу придумать решениния на функциональном языке, почитав пример, получаеться повторить приём, но самому что то новое - туго...

В то же время на Java/PHP5/JS любая задача в общих чертах решаеться за пару минут. Это не опыт и не база отработанных шаблонов, почти с каждой програмой придумываю новые, ранее не использованные пути.

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Void
Дата 22.10.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Sardar
Может быть, просто задачи такого рода попадаются? Действительно, многие задачи на ФЯ решаются даже сложнее... Но вот, скажем, для задач синтаксического анализа и символьных вычислений, я ничего подобного OCaml не видел.
Цитата(Sardar @ 22.10.2005, 16:00)
Сам изучал для себя Haskell и Lisp. Мощно, хотя синтаксис явно накурившись придумывали smile

Синтаксис LISP делался для того, чтобы было легко транслятору, а не программисту smile А Haskell... Да вроде вполне нормальный синтаксис smile

LSD
Цитата
Обосную чуть погодя.

Ждем-с.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.