Аноним,
А>Игрался неделю со scala, до этого читал статьи всяких проповедников ФП(один договорился до того что патnерны проектирования уже не нужны поскольку ФП самая замечательная вещь на свете). В результате пребываю в довольно странном состоянии — "И ЭТО ВСЕ? И ЧЕМ ЭТО ОТЛИЧАЕТСЯ ОТ ИП?".
Отличия ФП от ИП очень много обсуждалось здесь (с переменным успехом)
А>1) Функции высшего порядка (название то какое!) — принимают функции в качестве аргментов
А>и возвращают другме функции.
А>Вопрос: А чем это отличается от метода который принимает в качестве аргумента объект и возвращает другой, у которых есть не только свои методы и переменные члены, но и которые соответствуют определенной сущности предметной область.
Если интерфейс соответствует сущности — отлично. Это должна быть крупная сущность, иначе мы упрёмся в создании миллиона интерфейсов на каждый писк, типа IFile, IFileArchived, IFileArchivedWithRAR, IFileArchivedWith7z и т.п. И созданием объектов типа
interface IFromIAndI {
Integer call(Integer a, Integer b);
}
IFromIAndI add_two_integers = new IFromIAndI() {
public Integer call(final Integer a, final Integer b) {
return a + b;
}
};
Намано?
Ещё пример. Дан регексп, нужно узнать, матчится ли он с текстом:
Pattern pattern = new Pattern(regexp);
Matcher matcher = pattern.matcher(text);
if (matcher.matches()) ...
Это и есть
исполнение в Королевстве Существительных. Ты должен сначала создать нужных исполнителей, а потом сказать им: "Ду!" вместо непосредственного исполнения =matches regexp text=. Кроме замутнения самого Действия мы вдобавок получаем кучу побочных эффектов на пустом месте, там где можно было вполне обойтись без них.
К сожалению, крупные примеры в функциональном стиле будут вряд ли интересны читателю, поэтому и ограничиваются примерами типа =take k . quicksort=.
А>2) Tuple (кортежи??) — еще одна замечательная вещь, ДИКО МОЩНАЯ!!!!, позволяет вернуть сразу несколько вещей (в общем случае как я понимаю — устанавливает однозначное соотношение между членами кортежа и пихает в одну упаковку?)
А>Вопрос: А что мне мешает вернуть объект и запихнуть туда что угодно?
А>И.т.д.
Тебе нужно заводить тип (то есть плодить сущности без надобности), ты не можешь отождествлять объекты в соответствии со структурой, и ты не можешь делать паттерн-матчинг по содержимому объектов (обычно так, хотя в Scala есть unapply) и работа с объектами (обычно) более громоздка по сравнению с работой с кортежами.
А>Я прекрасно понимаю что ФП в чистом виде мало применимо
А>и есть такие языки как scala, сочетающие в себе оба подхода. Но вот после недели изучения скалы у меня сложилось такое впечатление что это обычный ИЯ с синтаксическим сахаром (анонимные параметризированные функции, матчинг) и несколько специфичным синтаксисом.
Да, это закономерное впечатление. Более того сам Мартин утверждает, что в Скале лучше всего делать высокоуровневые объекты в соответствии с декомпозицией на объекты и обобщая классы до трейтов и миксинов, а их реализацию делать преимущественно в функциональном стиле. Примерно так и написан сам компилятор и стандартная библиотека — можешь глянуть исходники.
А>В процессе прочтения статей я видел кучу примеров (в основном всякие математические вычисления или сортировка). Но я нигде не видел РЕАЛЬНЫХ примеров (из тех областей для которых пишется большинство программ).
Очень скользкая фраза... По причине выше, скорее всего на Скале будет мало чистых функциональных программ и всё ФП там представляет собой просто "сахарницу" средних размеров.
Реальное применение вообще ФП? Ну можно начать отсюда
http://rsdn.ru/Forum/Message.aspx?mid=2182617&only=1Автор: Didro
Дата: 26.10.06
А>По поводу шаблонов проектирования: я понимаю что GoF мало соответствует функциональному подходу, но не слышал чтобы кто-нибудь из функциональщиков приводил свой аналог, позволяющий стандартным образом провести декомпозицю задачи...
В ФП паттерны часто являются просто ФВП. Ну вот fold — чем не паттерн? Или map-reduce? Или класс типов Monad?
Reusable — безусловно. General — тоже (в рамках применимости конечно

).