Re[12]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Конечно, честные функции высшего порядка мы так не получим.


А так:

delegate int D(int i1, int i2);

int X(D d, int i1, int i2)
{
    ...
}


... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Т.е. ничего практически строгого не получается и весь груз ответственности ложится на программера, а не на компайлер?

К>Что-то как-то такое решение мне не кажется особо хорошим...

А тебе не странно что на том же ОКамле тоже есть побочные эффекты?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: +2 -3
Здравствуйте, Gaperton, Вы писали:

G>Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.


Ну, прям картина апокалипсиса. Вот толко по жизни писать на Шарпе как раз просто, а на ОКамле не очень.

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

G>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения.



Это никто не мешает сделать. Итератор по сути это класс с методом Next() и свойством Current. Никто не мешает в Next() генерировать новый элемент последовательности. Новый синтаксис просто избавляет от необходимости писать еще один класс.

G> Ух, какие это жесткие грабли в ИЯ! Брр!


Ты себе эти это специально внушаешь? Может чем тешить себя небылицами просто взять и попробоват пописать на Шарпе?

G>А так — вовсе они не ленивы.


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

S>>Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.

G>Ну, в общем случае — да. Никто не мешает так писать, и это в целом хороший стиль.

S>>А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.

G>Возможно.

100%. yield — это синтаксический сахар. Энумераторы (IEnumerable) паттерн введенный в язык еще при его рождении.

S>>Конечно, честные функции высшего порядка мы так не получим.

G> Nemerle. Получите, если захотите взять

Все еще проще. В Шарпе есть делегаты которые позволяют передавать ссылки на функции, так что формально функции высшего порядка в шарпе делаются. В шарпе нет патерн-мотчинга, что не позволяет писать в функциональном стиле на 100%. Но писать в СТЛ-ном стиле можно легко. Вот, например, методы из коллекции R#-а:
        /// <summary>
        /// Позволяет найти элемент.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public T Find(Predicate<T> predicate)
        {
            for (int i = 0; i < _len; i++)
                if (predicate(_ary[i]))
                    return _ary[i];

            return default(T);
        }

        /// <summary>
        /// Позволяет найти индекс элемента. Перебор начинается с конца списка и 
        /// продолжается до нулевого элмента.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public int FindLastIndex(Predicate<T> predicate)
        {
            for (int i = _len - 1; i >= 0; i--)
                if (predicate(_ary[i]))
                    return i;
            return -1;
        }

        /// <summary>
        /// Позволяет найти индекс элемента. Перебор начинается с конца списка и 
        /// продолжается до нулевого элмента.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public int FindIndex(Predicate<T> predicate)
        {
            for (int i = 0; i < _len; i++)
                if (predicate(_ary[i]))
                    return i;

            return -1;
        }
        
        
        /// <summary>
        /// <para>Позволяет выполнить некоторое действие для каждого элемента.
        /// </para>
        /// <para>Перебор осуществляется в прямом порядке.</para>
        /// </summary>
        /// <param name="action">Делегат выполняемый для каждого элемента.</param>
        public void ForEeach(Action<T> action)
        {
            for (int i = 0; i < _len; i++)
                action(_ary[i]);
        }


Вот определения делегатов (они объявлены во фрэймворке):
public delegate void Action<T>(T obj);
public delegate bool Predicate<T>(T obj);


А вот так можно применить данные методы:

SomeCollection<int> list = SomeCollection<int>(new int[]{ 1, 3, 4, 6, 9 });
int sum = 0;
// Жирным выделен анонимный метод, т.е. метод обявляемый инлайном.
// Забавно так же что можно использовать переменную sum объявленную
// в том же методе где вызывается list.ForEeach.
list.ForEeach(delegate(int elem){ sum += elem; });
Console.WriteLine(sum);

// В принципе можно вместо делегата просто передать ссылку на метод
// реализованный где угодно.
Multiplier multiplier = new Multiplier();
list.ForEeach(multiplier.Multiply);
Console.WriteLine(multiplier.Result);

...

class Multiplier
{
    public int Result = 0;
    public void Multiply(int elem)
    {
        Result *= elem;
    }
}


По большому счету не долго создать делегаты и функции вроде head(), tial(), prefix(), ... и реализовать функциональные выверты со списками. Вот только оно нафиг никому не нужно. Так как намного эффективнее и проще реализуется в императивном стиле. А вот когда функцональный становится удобнее, то можно прибегнуть и к нему.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: -1
Здравствуйте, Gaperton, Вы писали:

Блин. Ты по русски не понимашь? Или просто не хочешь поверить в то, что ленивые вычисления в ИЯ делаются как два палца об асфальт?

Поверь итераторы не менее ленивы чем Хаскель.

И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: -1
Здравствуйте, Gaperton, Вы писали:

G>Хотя, чтобы добиться такого же эффекта, ты на самом деле можешь фактически обойтись без контейнера, но заставить объект выглядеть снаружи как контейнер. Согласен, в этом смысле итераторы "ленивые".


Да. Долго же до тебя это доходило.

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

Энумератор это интерфейс. Выглядет примерно так:
    public interface IEnumerator<T> : System.IDisposable
    {
        T Current { get; }
        bool MoveNext();
    }


Реализоват ты его можешь как угодно. В методе MoveNext ты можешь производить любые вычисления сохраняя промежуточные резултаты в переменных-членах классов. А в свойстве Current возращать его. А можешь вообще генерировать элемент в Current, а в MoveNext просто изменять некий индекс или идентификатор который будет говорить, что нужно сгенерировать новый элемент.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Хм, но в этом случае ты не получишь автоматического кэширования результатов (что ты имеешь бесплатно с ленивыми типами данных), это придеться делать руками.


По сравнению с созданием класса реализующего итератор кэширвание просто фигня. К тому же в этом самом классе ты данные и будешь кэшировать. Кэшировать то нужно один элемент.

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

G>В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".


Ну, эта песня уже знакома. Ошибки бывают везде. Твое как бы чего не вышло — это желание не допустить логическую ошибку. Понятно, что программа с ошибкой и в африке правильно не заработает. Вот только и в фунициональном приложении логическую ошибку сделать не сложно.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Складские системы — одна из самых простых систем,


И сколько ты их собрал за свою жизнь?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Xentrax, Вы писали:

X>В последние годы массовую популярность завоевывали только те языки, которые накачивали бооольшими деньгами. А у С++ такая хорошая жизнь наступила из-за того, что компилятор С++ без проблем компилировал код на C (с некоторыми малозночительными "особенностями").


А С почему стал популярным? Не потому ли что на нем было написано подавляющиее бльшинство упешных ОС?

Ну, так в чем проблема написать такую ОС на одном из ФЯ? И деньги рекой сразу потеку.

Дело тут не в деньгах. А в удобстве при решени конкретных задач. Писать ОС на С/С++ куда удобнее чем на Хаскеле. Причем не из-за мега удобного синтаксиса, и из-за того что с памятью С позволяет оперировать удобно и эффективно.

X>MS обычным людям добра НЕ желает, а желает добра себе и побольше,


Экономис, былин. Все субъекты рынка работают на нем исключительно ради наживы. Но чтобы получить наживу они вынуждены делать добро другим. Так что все что прошло испытание рынком является нужным людям.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: +3 -1
Здравствуйте, INTP_mihoshi, Вы писали:

INT>А зачем? У них и так все хорошо Ну, не выходит WinFS — и хрен с ним. Выпустим без него, все равно купят. Ну, нету генериков на шарпе. Но все равно ж писать на нем будут.


Ну, а Сан тоже зажрался? Что же они не возмут и не замутят хотя бы ту же Яву на ФЯ? А ИБМ? Им то уж точно можно было бы упростить жизнь. Они же кучу прикладных решений к своим мэйнфрэймам лабают. Прикинь! Раз и проект сдан в 4 раза быстрее и с всотню раз меньшим количеством замечаний! А лафа! Ан нет тебе. Они даже Смолток используют, но не ФЯ.

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

ЗЫ

Я ничего не имею против ФЯ. Более того считаю, что многие идеи очень интересы и должны применяться в продуктах мэйнстрима. Но ненужно пиара. Лучше двигать технологии вперед и трезво оценивать ситуацию. Поймите, есть огромная разница между рекламщиной/пиаром и популяризацией идей. Последнее очень полезно и не раздражает. А первое просто таки настраивает проитв всего подхода в целом и горе-популяризаторов в частности.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

INT>ах да, забыл главную причину. Фя придумали не они Вот доделают F#...


F# делается энтузиастами. И судя по его состоянию врдя ли будет доведен до коммерческого состояния. Остается надееться на то, что МС или кто то из сильных мира вего повзаимствует правильные идеи и реализует их на подобающем уровне в своих языках.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: -3
Здравствуйте, Gaperton, Вы писали:

G>Приятно наверно считать себя умнее, а других глупее, не разбираясь при этом в предмете разговора. Но никого кроме себя ты не обманешь, потому как есть одна неувязочка, которую сложно скрыть.


Прчти вот эту свою фразу и отнеси к себе. Почему?

G>Ты понятия не имеешь что такое ФЯ,


Да потому что ты понятие не имешь что такое экономика. А он как раз говорил тут о ФЯ не как о языках программирования, а как о товаре и инструменте на ранке. И вы показали полное незнание в данном вопросе и так и не дали внятного и разумного ответа на его вопрос. Причем лично мне совершенно ясно почему. Потому что ответ вам не выгоден.

G> а в разговоре поучавствовать хочется.


Вот вот. Не нужно этих приемчиков. А то эту тему и так читают только те кто не равнодушен к ФЯ. А после оных приемчиков останутся одни явные фанаты. Давайте как уважать друг-друга. Он ни чем не хуже тебя. И это ты не хочешь дать честного ответа на его довольно просто вопрос.

G> Именно поэтому, за отсутствием возможности поговорить о ФЯ предметно, ты переводишь разговор на МС.


Или кто-то понимая, что честный ответ на вопрос ему не выгден пытается решить спрор банальной демагогией.

G> В общем, оставляю тебя дальше рассуждать об МС, слонах и китах капитализма, и кто кого победит. Вышепомянутые слоны идут в пеший тур в Таиланд. Надоело.


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

ЗЫ

В общем, таким образом вы распугаете даже самых стойких людей интересующихся ФЯ. Завязывайте эту бесталковую ветку и займитесь делом. Сделайте наконец достойный документ. Сделайте его таким, чтобы его понимали люди не имеющеие специального математического образования. Я готов помогать вам в этом вопросе. И не нужно лить грязи на собеседника если он высказал неугодную вам точку зрения. Лучше найдите честные и убедительные аргументы. Или просто признайте что не все так замечательно как вы описываете. Иначе результат будет точно обратный цели.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: +2 -1
Здравствуйте, Gaperton, Вы писали:

G>Хочешь узнать истинную причину отсутствия аргументов? Мне просто не интересно с тобой трепаться. Се ля ви.


Так не трепался бы.

Неужели ты не понял, что своим трепом в данном случае ты еще немного расширил пропасть между ФЯ и мэйнстрим-программистами?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: :)
Здравствуйте, ON, Вы писали:

ON>Hejlsberg: Parts of Word, internally, use a p-code engine because it's more compact.

ON>http://windows.oreilly.com/news/hejlsberg_0800.html

ON>Наверняка это не p-code языка C++.


Точно Хаскеля.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.04 03:47
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Не совсем так. Допустим, у тебя одна функция заполняет вектор значений, нетривиально вычисляя каждое значение.


G>И вот ты хочешь пробежаться по нему итератором. В "ленивой" реализации у тебя по крайней мере "ленивые" конструкторы элементов массива, так что элементы не будут на самом деле вычислены, пока ты не обратишься к ним через итератор. Вычисление будет отложено до момента чтения, который может вообще не случиться. Понимаешь разницу? Это позволяет тебе определять бесконечные (или ну очень большие) структуры данных, например.


G>В строгой реализации все элементы контейнера будут вычислены сразу, а итератор — ну это просто итератор. Он никакой, ни ленивый, ни строгий. Это просто акцессор, интерфейс, способ доступа. А вот контейнер — строгий.

Тут надо просто понять, что первичен именно итератор. А вовсе не контейнер. Числа Фибоначчи — это никакой не массив и не список. Их можно только итерировать. И та статья об этом совершенно четко говорит.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.04 03:47
Оценка: +1
Здравствуйте, mdw, Вы писали:
mdw>"Традиционно,это можно осуществить, сохраняя вывод F во временный файл", в смысле:
mdw>Modul1.Out >> TempFile(Googol Mb) >> Modul2.In
mdw>А каким эзотерическим способом (на обыкновенном процессоре и памяти) данные попадают из G в F в Фя?
mdw>G — это кусок маш. кода, и F тоже. Через какой астрал кусок кода F получает (Googol Mb) из G, как это нельзя сделать "традиционно"?

mdw>Сказка ложь, да в ней намек...

Смысл в том, что инициатива у последнего. Вместо того, чтобы вычислять данные, которые могут когда-то понадобиться, и складывать их в промежуточном виде (управление со стороны ввода), самый последний в цепочке запрашивает данные у предыдущих по мере необходимости (если она когда-нибудь возникнет).
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 06:18
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.


Подумалось, кстати, что в этом смысле ФОП похоже на ООП. Т.е. в функциональом стиле, как и в объектном, можно программировать почти на всех неспециализированных языках. А ОО или ФО языки — это просто языки, семантика и прагматика которых ориентированы на соответствующий подход. Кстати, ООП и ФОП похожи еще в том смысле, что первый является эффективнысм инструментом манипулирования и инкапсулирования с точки зрения структур данных, а второй — с точки зрения алгоритмов.
Re[18]: Сильные стороны функционального программирования
От: Quintanar Россия  
Дата: 02.09.04 07:10
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Хаскель это встоено как поганая надстройка


С чего это ты это взял?
Re[14]: Сильные стороны функционального программирования
От: Quintanar Россия  
Дата: 02.09.04 07:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А тебе не странно что на том же ОКамле тоже есть побочные эффекты?


Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно. Реально, императивные места встречаются редко и их легко отследить.
Re[14]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 07:15
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Gaperton, Вы писали:


G>>Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.


VD>Ну, прям картина апокалипсиса. Вот толко по жизни писать на Шарпе как раз просто, а на ОКамле не очень.


VD>Ну, нет на практике проблем там где ты их ищешь. Есть в других местах, но как раз они тебе не интересны, так как не подтверждают теорию по которой ФЯ всегда рулят.


Дорогой Влад, последние 6 лет я в составе команды человек в 20 занимался разработкой и поддержкой клиент серверного приложения объемом ~60 мегабайт кода (это 3-5 миллионов строк, не считая комментариев и пустых) написанного на С++, из которых 18 — моя зона ответственности. И это не какой-нибудь простой препроцессор, а сервер своей базы данных, интерпретатор всроенного языка, обработка потока котировок в реальном времени, и еще куча всего.

Поверь мне, я знаю, какие проблемы бывают на практике, а каких не бывает. И каждый, кто учавствовал в проектах размером от 100 тыщ строк, знает, какие интересные эффекты начинаются. И неделя на один дефект — это ерунда, Влад, это типичная ситуация. А бывает месяц вдвоем на один дефект. А бывает два месяца — и никакого результата.
Re[15]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 07:51
Оценка:
Здравствуйте, Quintanar, Вы писали:


Q>Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно. Реально, императивные места встречаются редко и их легко отследить.


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

К сожалению, в OCaml даже слишком много императивщины. В том числе и в библиотеках.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.