пятница, 29 февраля 2008 г.

Сумбурные мысли о С++ , или С++ как функциональный язык

В сущности это продолжение записи "Разъединяем строки, объединяем строки..."

Функциональные возможности языка С++ очень ограничены и слабы. Но несмотря на это я раз за разом вижу как фанаты С++ отстаивают право С++ быть самым лучшем фукнциональным языком... Диалог обычно происходит следующим образом:
- Вот как это делается в Haskell
- Ха, в С++ можно сделать вот так, это практически то же самое.

Нет, не то же самое. Другое. Не учтен целый ряд факторов, целый ряд неявных плюшек которые дают языку явные функциональные возможности. Да и выглядит код ну очень грустно. Особенно для тех кто понимает и что такое функциональный код и каким он может/должен быть.

Проблема С++ и его фанатов - славное прошлое языка С++. Было время когда С++ был безоговорочный "номер первый" в программировании. Причем не такой "новый первый" каким сейчас является..наверно java.Или VB, не в курсе. С++ применялся во всех областях и для всех задач. Были конечно и другие языки, которые где-то там как-то там применялось...но доминирование С++ было подавляющим. А остальные языки были как говорится никто и звали их никак.

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

Ну и что, все так плохо? Да нет вобщем-то. Для примера - никого ведь особо не беспокоит что Bentley не очень хорошо подходит для перевозки крупногабаритных грузов...

Кстати. Java - тоже вполне себе функциональный язык!!! На мем можно писать функционально!!!

Например вот так (источник вдохновения):

public int calcPriceInternalIterator(List items)

{

    Iterator i = items.iterator();

    UnaryFunction getItemPrice = new UnaryFunction()

    {

        public Object evaluate (Object obj)

        {

            return new Double(((SETLItem)obj).getPrice());

        }

    };

    Constant usd100 = new Constant(new Double(100));

    BinaryPredicateUnaryPredicate moreThanUSD100 = new BinaryPredicateUnaryPredicate

        (new UnaryCompositeBinaryPredicate(new IsGreaterThanOrEqual(), getItemPrice, usd100));

    FilteredIterator fi = new FilteredIterator(i, moreThanUSD100);

    Summer addPrice = new Summer();

    Algorithms.foreach(fi, addPrice);

    return addPrice.getSum();

}


Обьясняю шутку...
Python "почти" эквиваленты:

a = [123,98,12,124,1007,2344]

 

sum1  = sum(filter(lambda x: x > 100,a))

sum2  = sum([x for x in a if x > 100])

sum3  = reduce( lambda x,y:x+y,[x for x in a if x > 100])

sum4  = reduce( lambda x,y:x+y,filter(lambda x: x > 100,a))


С# - фукнционально+LINQ

List<int> a = new List<int> { 123, 98, 12, 124, 1007, 2344 };

 

var sum1 = (from x in a where x > 100 select x).Sum();

var sum2 = a.filter(x => x > 100).reduce((x, y) => x + y);

Комментариев нет: