2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 15:12 


07/05/15

110
aa_dav в сообщении #1017201 писал(а):
я не понимаю к чему ваши примеры про номиналы или равенство программ.


К тому, что мы берем объект, и возвращаем объект
Код:

Account := Object clone do(
balance ::= 0
deposit := method(amount, setBalance(balance + amount))
)

account := Account clone

deposit := method(amount, account, account deposit(amount); account)

deposit(10, account) print
deposit(30, account) print

# :::  Account_0xbb0a18:
# :::   balance          = 10
# :::  Account_0xbb0a18:
# :::   balance          = 40

функция deposit всегда возвращает одно и то же -- тот же экземпляр аккаунта, который подается на вход ее. В чем нечистота? Так же и с random. Я запутался, конечно, по поводу new вы возможно правы, но если она будет возвращать всегда тот же экземпляр random, который подается в качестве аргумента, она останется чистой во всех смыслах, она возвращает всегда одно и то же.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 15:48 


11/12/14
893
nondeterminism в сообщении #1017215 писал(а):
функция deposit всегда возвращает одно и то же -- тот же экземпляр аккаунта, который подается на вход ее. В чем нечистота?


Здесь нечистота проистекает не из содержания функции deposit, а из-за наличия set в методе и потому mutable данного.
Причём в данном коде концептуально проблема еще не видна.
Вот где она появится:
Код:
var account = new Account;
function something( account )
{
     return function() { return deposit( 10, account ); };
};
var subfunc = something( account );
// следующие куски кода поведут себя по разному:
// 1 вариант
deposit( 10, account );
print subfunc();
// 2 вариант
print subfunc();
deposit( 10, account );

(1-ый и 2-ой варианты взаимоисключающи).
т.е. мы получили нечистую функцию, её результат зависит не только от параметров, а и от внешнего окружения.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:27 
Заслуженный участник


27/04/09
28128
Хотел упомянуть Disciple, но, видимо, не стоит, а то ещё вдруг у nondeterminism взорвётся мозг…

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:30 


07/05/15

110
aa_dav в сообщении #1017223 писал(а):
т.е. мы получили нечистую функцию, её результат зависит не только от параметров, а и от внешнего окружения.


Я не вижу тут никакой зависимости от параметров или внешнего окружения
Код:


Account=function(){}
Account.prototype={
balance: 0,
deposit: function(amount){this.balance+=amount}
}

var account = new Account;

account.name="this account"

deposit=function(amount, account){account.deposit(amount); return account}

function something( account )
{
     return function() { return deposit( 10, account ); };
};

subfunc = something( account );

deposit( 10, account );
console.log(subfunc())

console.log(subfunc());
deposit( 10, account );

console.log(subfunc());

// ::: { name: 'this account', balance: 20 }
// ::: { name: 'this account', balance: 30 }
// ::: { name: 'this account', balance: 50 }

она по прежнему всегда возвращает одно о то же.

-- 19.05.2015, 17:35 --

arseniiv

По поводу взрыва мозга -- это Вы себе льстите, по поводу же Вашей бумаги: я не читаю абы что, иначе я бы уже перечитал весь литературный мусор на планете. Прежеде чем что-либо читать, я сначала должен быть уверен, что оно мне нужно.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:40 


11/12/14
893
nondeterminism в сообщении #1017252 писал(а):
она по прежнему всегда возвращает одно о то же.


Если // ::: это выводы console.log, то блин, видно что оно возвращает разный результат. А должно быть balance: 10 три раза.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:44 


07/05/15

110
aa_dav в сообщении #1017255 писал(а):
видно что оно возвращает разный результат. А должно быть balance: 10 три раза.


Давайте, таки, определимся с терминологией. Функция возвращает один и тот же объект. Всегда. То что у этого объекта изменяется состояние, нашу функцию не волнует.
Цитата:
разный результат

один и тот же объект -- это разный результат?

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:51 
Заслуженный участник


27/04/09
28128
nondeterminism в сообщении #1017252 писал(а):
я не читаю абы что
Не читайте и дальше.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:52 


11/12/14
893
nondeterminism в сообщении #1017258 писал(а):
один и тот же объект -- это разный результат?


Да.
Функция должна вернуть что то с чем одинаковый кусок кода выдаст одинаковый результат.
Код:
console.log(func())

должно вести себя абсолютно одинаково и ни от чего более не зависеть.
Сколько раз не напиши подряд - должно быть 10,10,10,10...
Видим код - сразу же сужаем те возможности что он может сделать.
Чистота функций в ФП рассматривается в полезном смысле именно благодаря этому свойству. Иначе бы никому и не было бы интересно.
Видим:
Код:
func1(f(arg),g(arg))

и к примеру совершенно не заморачиваемся сперва вычислится ли f(arg) или сперва вычислится g(arg). Порядок вычисления НЕВАЖЕН.
Отсюда возможности к параллелизму и т.п.
На корню такую возможность срубает мутабельность и вот эти вот ссылочные мутабельные объекты.
Если дело принимает такой оборот программа обрастает мгновенно невидимыми и неявными но сильными связями затрудняющими то-то и то-то.
В этом смысле чистое ФП воспринимается как некая "благодать".
Но признаюсь тоже в данный момент - я не сильный поклонник ФП, хотя признаю что штука красивая и как минимум отличная разминка для мозгов.
Но я в практике сильно не сталкивался и более того - не хочу.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:04 


07/05/15

110
aa_dav в сообщении #1017263 писал(а):
Сколько раз не напиши подряд - должно быть 10,10,10,10...


Код:

sum = function(x, y){return x + y}

with(console){
  log(sum(1, 2).foo)
   Number.prototype.foo="bar"
  log(sum(1, 2).foo)
}

// ::: undefined
// ::: bar

ф-ция sum по-Вашему, чистая?

-- 19.05.2015, 18:10 --

aa_dav в сообщении #1017263 писал(а):
Отсюда возможности к параллелизму и т.п.


Но ведь в рамках чистого ФП невозможен параллелизм. Об этом еще Барендрегт в начале своей книги пишет. И с чего Вы взяли, что ФП абстрангированно от последовательности вычислений? Как раз наоборот, одна редукция за другой, строго последовательная модель.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:13 


11/12/14
893
nondeterminism в сообщении #1017272 писал(а):
ф-ция sum по-Вашему, чистая?

тут - уже нет.
если вы не поняли почему (и почему яваскрипт не чистый ФЯ), то... возьмите SICP да почитайте.

-- 19.05.2015, 18:14 --

nondeterminism в сообщении #1017272 писал(а):
Но ведь в рамках чистого ФП невозможен параллелизм.


Ух ты! А что в чистом ФЯ мешает вычислить f(arg) и g(arg) параллельно?

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:17 


07/05/15

110
aa_dav в сообщении #1017280 писал(а):
возьмите SICP да почитайте.


Я читал sicp достаточно забубенная книга, но в SICP конкретно заявляется, между прочим ровно то, что я сказал в стартовом топике. ФП -- слабая парадигма для проектирования моделей реального мира. С этого начинается, ЕМНИП 3-я глава.

-- 19.05.2015, 18:18 --

aa_dav в сообщении #1017280 писал(а):
А что в чистом ФЯ мешает вычислить f(arg) и g(arg) параллельно?


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

-- 19.05.2015, 18:24 --

aa_dav в сообщении #1017280 писал(а):
и почему яваскрипт не чистый ФЯ


javascript -- это вообще ни разу не ФЯ. Но у нас разговор не о языке, а о функциях.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:26 
Заслуженный участник


27/04/09
28128
Если я правильно помню семантику соответствующих мест JS, та функция sum чиста.

P. S. Но вы тот кусок кода написали, видимо, с намерением показать разный результат в исполнении чистой функции? Не вышло, потому что разные результаты — у выполнения атрибута foo уже готового результата функции, а не у неё.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:27 


11/12/14
893
nondeterminism в сообщении #1017282 писал(а):
С этого начинается, ЕМНИП 3-я глава.


Лол, да, там сперва дифирамбы поются немутабельности и чистоте, а потом в какой то момент хренак - и говорится что очередь (кажется) мы бы без set не реализовали эффективно и вся последющая книга идёт с применением set. Да, я тоже заметил.

nondeterminism в сообщении #1017282 писал(а):
Именно то, что там строго последовательная модель вычислений. Один шаг -- одна редукция.


Так а что мешает в
Код:
func(f(arg),g(arg))

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

-- 19.05.2015, 18:28 --

arseniiv в сообщении #1017284 писал(а):
Если я правильно помню семантику соответствующих мест JS, та функция sum чиста.


Функция то чиста. JS нечист. =) И то что nondeterminism делает там - нечисто.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:30 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #1017285 писал(а):
И то что nondeterminism делает там - нечисто.
То, что он там делает, типично для JS, хотя не сказать чтобы этот язык мне нравился. (Но он мне не нравится из-за динамических типов, а не «грязноты».)

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:35 


07/05/15

110
arseniiv в сообщении #1017284 писал(а):
Не вышло, потому что разные результаты — у выполнения атрибута foo уже готового результата функции, а не у неё.

Ровно то же самое и тут:
Код:
Account=function(){}
Account.prototype={
balance: 0,
deposit: function(amount){this.balance+=amount}
}

var account = new Account;

account.name="this account"

deposit=function(amount, account){account.deposit(amount); return account}

function something( account )
{
     return function() { return deposit( 10, account ); };
};

subfunc = something( account );

deposit( 10, account );
console.log(subfunc())

console.log(subfunc());
deposit( 10, account );

console.log(subfunc());

// ::: { name: 'this account', balance: 20 }
// ::: { name: 'this account', balance: 30 }
// ::: { name: 'this account', balance: 50 }

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 106 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group