Re[10]: Функциональное программирование для всех
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 25.10.06 12:50
Оценка:
Кодт,

К>Ну почему же. Я искренне недоумевал, зачем привинчивать ФВП в тех местах, где они необязательны. "Когда в моей руке молоток, то всё вокруг кажется гвоздями".

К>Разумеется, бывают ситуации, в которых ФВП существенно упрощают жизнь: да хотя бы обработка последовательностей (большинство из операций можно выразить с помощью fold или foldr) или монадные операции.
К>Но в двух предыдущих примерах...

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

Когда мы сравниваем 2 языка на скорость и выбираем некоторый тест, например alphablend, считается некорректным приводить другой алгоритм, не так ли (отбросим философский вопрос о нужности таких сравнений )? А здесь такое же сравнение, только на выразительность.

К>Вот если так сформулировать вопрос: одна и та же задача более-менее равно (по количеству писанины) решается с и без ФВП. Может быть, без ФВП чуть длиннее (не в разы, а в проценты). Какие доводы за то, чтобы выбрать вариант с ФВП?


Меньше сущностей — больше ясность — гармоничнее гармония!
Вместо делегатов, колбасок (callbacks), функторов, эмуляторов лямбд, стратегий, композитов с декораторами использовать только ФВП — разве плохо?

Но если вернуться к разговору о C++... Как мы можем в C++ выбрать вариант с ФВП? Мы можем выбрать вариант с loki:functor, boost:function или своей реализацией function, что нибудь типа
  template<typename Function> // function type R (T1, T2, ..., TN),
  class function 
    : public unary_function<R, T1> // iff N == 1
    : public binary_function<R, T1, T2> // iff N == 2
  {
  public:
    typedef R result_type;
        ...
    R operator()(T1, T2, ..., TN) const;
  };

но это по-прежнему будет просто шаблонный класс, один из многих сотен (вопрос на засыпку: насколько большое N даст всем всеобщее щастье?). И не факт, что он будет подходить во все дыры, а значит не факт, что сущности не будет плодиться, будучи отражением одной и той же идеи.

Последний пример.
Можно в принципе подумать как написать на C++ аналог Parsec (или другой библиотеки комбинаторов). Но сомневаюсь, что это будет так же красиво для пользователя. (И сомневаюсь, что будет просто).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.