Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2014, 23:16   #91
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

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

Код:
public static void Main(string[] args)
{
    args.ForEach(e=> LogManager.GetLogger("main").Info(GetTime()+e));
}
the_deer_one вне форума Ответить с цитированием
Старый 25.01.2014, 06:17   #92
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Монады ≠ нечистота.
Да, а ввод-вывод нечистота. Пример с выводом строки был ранее. Смысл ходить по кругу?
Цитата:
Так что о "грязности" IO в ленивых языках еще можно поспорить.
Нечего тут спорить. Что там за жалкая отмазка была выше? Еще раз - пример с выводом строки на экран.
Цитата:
то же самое но на функциональном языке и с чистотой.
Никак с чистотой. Сейчас он засунет такой вызов в обертку, назовет это монадой и скажет, что все чисто
Цитата:
Например что-бы добавить элемент в конец списка, нужно целиком создать новый список.
А создание списка это чистота?
1. То что я сам не удалил объект, а это сделала среда исполнения - значит все-таки объекты изменяемы ?
2. Пересоздание списка по масштабам внутренних изменений вызывает гораздо больше всяких революций внутри среды исполнения чем просто его модификация. Поэтому если модификация списка создана через задний проход это не означает, что все хорошо.
3. Даже если считать, что не ты меняешь мир, а сам мир меняется под твои желания общий итог все равно один и тот же .
4. C# тоже имеет сборку мусора, там тоже можно не вытирать за собой, но все равно не тру.
Цитата:
Возможно вы опять воскликните, что если в программу на Делфи тоже засовывать одни и те же аргументы, то она тоже будет срабатывать одинаково
Так я могу вместо аргумента написать вызов функции в качестве параметра
Код:
function TForm1.x(): String;
begin

    result:='Utkin';
end;
///////////////////////////////////////////

function TForm1.y(a: String): String;                  //  Это монада 
begin

    result:=a;                     
end;
/////////////////////////////////////////////////////

procedure TForm1.FormCreate(Sender: TObject);
begin

    Form1.Caption:=y(x());     // Вот она магия
end;
Я сам не создал ни одну переменную (явно). Оля-ля-ля, Делфи теперь функциональный язык!
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 25.01.2014 в 08:41.
Utkin вне форума Ответить с цитированием
Старый 25.01.2014, 12:31   #93
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

PHP красив и понятен
motorway вне форума Ответить с цитированием
Старый 25.01.2014, 15:26   #94
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
1. То что я сам не удалил объект, а это сделала среда исполнения - значит все-таки объекты изменяемы ?
Не имеет значения, если на объект никто не ссылается, значит он уже не существует.
Цитата:
А создание списка это чистота?
Перефразирую: "Возвращение результата функцией это чистота?"
Цитата:
Так я могу вместо аргумента написать вызов функции в качестве параметра
Писать чистые функции можно на разных языках и некоторые компиляторы способны их обнаруживать
Цитата:
4. C# тоже имеет сборку мусора, там тоже можно не вытирать за собой, но все равно не тру.
Он и не будет тру.
Цитата:
Никак с чистотой. Сейчас он засунет такой вызов в обертку, назовет это монадой и скажет, что все чисто
Я назову это монадой, потому как мне нужно реализовать связывание значений возвращенных функциями с "переменными", а так же что бы организовать последовательность выполнения операция сверху вниз, хотя при желании можно и снизу вверх ))(путем определения зависимости между данными)
А теперь зачем нужна монада IO. Компилятор по умолчанию считает что все функции чистые будь то IO или любая другая. Функции в Хаскеле не могут менять внешний мир, но это могут делать функции лежащие за его пределами, функции OS например. Если бы не использовали бы монаду IO, то функции вызывались бы как попало и программа работала бы всегда не правильно, т.к. компилятор бы считал что раз функции передается всегда один и тот же аргумент, то и вернуть можно всегда только одно и тоже значение ), например
chars = [getChar, getChar]
если один из(может вызваться любой) getChar вернет "ё", то следующий без лишних вопросов тоже вернет "ё". И любой последующий вызов getChar без аргументов будет возвращать "ё", до тех пор, пока не остановим программу и не запустим по новой. Монада IO, задает связь между данными, что гарантирует выполнение IO действий последовательно а также любой последующий вызов того же getChar будет выполнен с другим аргументом, что не умоляя общности о чистоте всех функций предоставит возможность к вводу данных.
Операции вывода, такие как putStrLn или writeFile и т.д. тоже возвращаются всегда одно и тоже значение IO (), также не умоляя общности о чистоте функций в Хаскеле. Хотя операции вывода также могут возвращать разные значения, т.к. IO гарантирует их вызов всегда с другими аргументами.
gatChar вернет IO Char, что бы преобразовать его в простой Char, то достаточно выполнить связывание например так:
c <- gatChar
c теперь имеет тип Char
Собственно при желании можно организовать IO и без монады IO, но придется поднапрячь мозги чтобы заставить компилятор выполнять действия последовательно и всегда с разными аргументами для функций выполняющий чтение/запись, иначе получится каша.
Компилятор считает что все функции чистые, без исключений!
Kostia вне форума Ответить с цитированием
Старый 25.01.2014, 16:02   #95
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,678
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
Не имеет значения, если на объект никто не ссылается, значит он уже не существует.
Что ничуть не умаляет корявости используемого подхода для модификации переменных.

Цитата:
Сообщение от Kostia Посмотреть сообщение
Писать чистые функции можно на разных языках и некоторые компиляторы способны их обнаруживать
Ну слава богу.

Цитата:
Сообщение от Kostia Посмотреть сообщение
А теперь зачем нужна монада IO. Компилятор по умолчанию считает что все функции чистые будь то IO или любая другая. Функции в Хаскеле не могут менять внешний мир, но это могут делать функции лежащие за его пределами, функции OS например. Если бы не использовали бы монаду IO, то функции вызывались бы как попало и программа работала бы всегда не правильно, т.к. компилятор бы считал что раз функции передается всегда один и тот же аргумент, то и вернуть можно всегда только одно и тоже значение )
Ага, оказывается, компилятор реализован весьма тупо, поэтому приходится городить явные костыли, чтобы он работал.

Цитата:
Сообщение от Kostia Посмотреть сообщение
Собственно при желании можно организовать IO и без монады IO, но придется поднапрячь мозги чтобы заставить компилятор выполнять действия последовательно и всегда с разными аргументами для функций выполняющий чтение/запись, иначе получится каша.
То есть в любом случае придется все делать через одно известное место Есть даже выбор среди протезов.

Цитата:
Сообщение от Kostia Посмотреть сообщение
Компилятор считает что все функции чистые, без исключений!
И это уже идет вразрез с реальностью, то есть не фича, а баг, заставляющий писать костыли

Хотели как лучше, получилось как всегда:
1. Придумываем красивый простой язык.
2. Пишем тупой компилятор.
3. Патчим под него язык, превращая в Г.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 25.01.2014 в 16:08.
MihalNik вне форума Ответить с цитированием
Старый 25.01.2014, 16:39   #96
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
3. Патчим под него язык, превращая в Г.
Ахахах, по вашему математика Г.? На выходе получаем суперпозицию функций, которым применимы все математические преобразования в локальном и глобальном смысле. Чистый код можно писать и на С, но выглядеть это будет ужасно, да и средства оптимизации подобного кода не настолько развиты как в фп.
Цитата:
И это уже идет вразрез с реальностью, то есть не фича, а баг, заставляющий писать костыли
С какой это еще реальностью? o_O
Цитата:
То есть в любом случае придется все делать через одно известное место Есть даже выбор среди протезов.
Где вы видите костыли? Все строго по канонам математики.
Цитата:
Что ничуть не умаляет корявости используемого подхода для модификации переменных.
Нет переменных! Можно только создавать новые данные в виде результатов возвращаемых функциями. Вся программа это одна большая функция(суперпозиция функций), места переменным тут просто нет.
Kostia вне форума Ответить с цитированием
Старый 25.01.2014, 16:46   #97
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

об чем сыр-бор?
eval вне форума Ответить с цитированием
Старый 25.01.2014, 17:14   #98
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,678
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
об чем сыр-бор?
О языке с костылями, не позволяющими видеть костыли

Цитата:
Сообщение от Kostia Посмотреть сообщение
Ахахах, по вашему математика Г.?
Безусловно. В том виде, в котором существует - Г. Сапожник без сапог.

Цитата:
Сообщение от Kostia Посмотреть сообщение
С какой это еще реальностью? o_O
Так Вы определитесь. Все функции действительно являются чистыми или это "мнение" разработчика компилятора, требующее всякий раз городить оболочку для ввода/вывода?

Цитата:
Сообщение от Kostia Посмотреть сообщение
Нет переменных! Можно только создавать новые данные в виде результатов возвращаемых функциями. Вся программа это одна большая функция(суперпозиция функций), места переменным тут просто нет.
Не переусердствуйте. А то вылезет грыжа - монада=)
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 25.01.2014 в 17:30.
MihalNik вне форума Ответить с цитированием
Старый 25.01.2014, 17:49   #99
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Код:
Form1.Caption:=y(x());     // Вот она магия
И где тут магия, почему бы просто не написать
Код:
Form1.Caption:='Utkin';
?
Смысл от этого не изменится. Вы явно меняете объект Form1, вместо того чтобы создать новый с измененным заголовком и вернуть его.
Kostia вне форума Ответить с цитированием
Старый 25.01.2014, 18:02   #100
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,678
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
?
Смысл от этого не изменится. Вы явно меняете объект Form1, вместо того чтобы создать новый с измененным заголовком и вернуть его.
Смысл в том что явно приходится писать всякую фигню, не имеющую никакого отношения к задаче. Просто компилятор иначе не понимает. Ленивые вычисления это хорошо. Ленивая реализация компилятора это плохо. А когда для ее оправдания создают целую теорию - это диагноз.

Вам было бы удобно, если у Вас на работе считалось бы, что 2*2= 5, а 5+3=7, но 4+4=10?
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 25.01.2014 в 18:04.
MihalNik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопросик самым опытным :-) Doholyan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.08.2009 17:13
Проблема с синтаксисом? Geddar PHP 1 30.06.2008 16:44
Казус с синтаксисом???... Sota Общие вопросы C/C++ 6 17.07.2007 19:15